/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact d02833adf331a5913226595306d64731a3da33f6:


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 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 20 20 20 20 20 2f 2a      0x01      /*
52b0: 20 4e 65 76 65 72 20 73 70 69 6c 6c 20 63 61 63   Never spill cac
52c0: 68 65 2e 20 20 53 65 74 20 76 69 61 20 70 72 61  he.  Set via pra
52d0: 67 6d 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  gma */.#define S
52e0: 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
52f0: 4b 20 20 20 20 30 78 30 32 20 20 20 20 20 20 2f  K    0x02      /
5300: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5310: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5320: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5330: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5340: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 20 20  YNC      0x04   
5350: 20 20 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20 6f     /* Spill is o
5360: 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73 79  k, but do not sy
5370: 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  nc */../*.** An 
5380: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
5390: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
53a0: 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e 20  f struct Pager. 
53b0: 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  A description of
53c0: 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  .** some of the 
53d0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d  more important m
53e0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
53f0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65  follows:.**.** e
5400: 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  State.**.**   Th
5410: 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74 65  e current 'state
5420: 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  ' of the pager o
5430: 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20 63  bject. See the c
5440: 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65  omment and state
5450: 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62  .**   diagram ab
5460: 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72 69  ove for a descri
5470: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ption of the pag
5480: 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  er state..**.** 
5490: 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  eLock.**.**   Fo
54a0: 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b  r a real on-disk
54b0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
54c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
54d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
54e0: 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f   file -.**   NO_
54f0: 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
5500: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
5510: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
5520: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  CK..**.**   For 
5530: 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  a temporary or i
5540: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
5550: 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68  e (neither of wh
5560: 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a  ich require any.
5570: 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69  **   locks), thi
5580: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  s variable is al
5590: 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c  ways set to EXCL
55a0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63  USIVE_LOCK. Sinc
55b0: 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61  e such.**   data
55c0: 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61 76  bases always hav
55d0: 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76  e Pager.exclusiv
55e0: 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74  eMode==1, this t
55f0: 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a  ricks the pager.
5600: 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20  **   logic into 
5610: 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74  thinking that it
5620: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c   already has all
5630: 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69   the locks it wi
5640: 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65  ll ever.**   nee
5650: 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e  d (and no reason
5660: 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d   to release them
5670: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f  )..**.**   In so
5680: 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69 72  me (obscure) cir
5690: 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73  cumstances, this
56a0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c   variable may al
56b0: 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20  so be set to.** 
56c0: 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20    UNKNOWN_LOCK. 
56d0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
56e0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
56f0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
5700: 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69  K for.**   detai
5710: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65  ls..**.** change
5720: 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20  CountDone.**.** 
5730: 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76    This boolean v
5740: 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
5750: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
5760: 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  t the change-cou
5770: 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20  nter .**   (the 
5780: 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 69  4-byte header fi
5790: 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66 73  eld at byte offs
57a0: 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61 74  et 24 of the dat
57b0: 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a  abase file) is .
57c0: 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64  **   not updated
57d0: 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e   more often than
57e0: 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a   necessary. .**.
57f0: 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20 74  **   It is set t
5800: 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65 20  o true when the 
5810: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
5820: 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
5830: 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e   which .**   can
5840: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
5850: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
5860: 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
5870: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
5880: 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61 72  **   It is clear
5890: 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65  ed (set to false
58a0: 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78  ) whenever an ex
58b0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
58c0: 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68  .**   relinquish
58d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
58e0: 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69  se file. Each ti
58f0: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
5900: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a   is committed,.*
5910: 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f  *   The changeCo
5920: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
5930: 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69 74  inspected. If it
5940: 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f   is true, the wo
5950: 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74  rk of.**   updat
5960: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
5970: 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65  ounter is omitte
5980: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
5990: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
59a0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68  *.**   This mech
59b0: 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74  anism means that
59c0: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   when running in
59d0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
59e0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a   a connection .*
59f0: 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70  *   need only up
5a00: 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
5a10: 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f  counter once, fo
5a20: 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61 6e  r the first tran
5a30: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d  saction.**   com
5a40: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65  mitted..**.** se
5a50: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
5a60: 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74  When PagerCommit
5a70: 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61  PhaseOne() is ca
5a80: 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61  lled to commit a
5a90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
5aa0: 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61   may.**   (or ma
5ab0: 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61  y not) specify a
5ac0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5ad0: 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74  name to be writt
5ae0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
5af0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62    journal file b
5b00: 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63  efore it is sync
5b10: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
5b20: 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e  *   Whether or n
5b30: 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ot a journal fil
5b40: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73  e contains a mas
5b50: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b60: 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20  ter affects .** 
5b70: 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68 69    the way in whi
5b80: 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ch the journal f
5b90: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ba0: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
5bb0: 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20  action is .**   
5bc0: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
5bd0: 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75  led back when ru
5be0: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5bf0: 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20  l_mode=PERSIST" 
5c00: 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20  mode..**   If a 
5c10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
5c20: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
5c30: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
5c40: 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a  ointer, it is.**
5c50: 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20     finalized by 
5c60: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c70: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
5c80: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5c90: 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65  . If.**   it doe
5ca0: 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  s contain a mast
5cb0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5cc0: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
5cd0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ce0: 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61   .**   by trunca
5cf0: 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20  ting it to zero 
5d00: 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69  bytes, just as i
5d10: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
5d20: 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e   were .**   runn
5d30: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5d40: 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d  mode=truncate" m
5d50: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75  ode..**.**   Jou
5d60: 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20  rnal files that 
5d70: 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a  contain master j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
5d90: 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69  cannot be finali
5da0: 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20  zed.**   simply 
5db0: 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  by overwriting t
5dc0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
5dd0: 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72  -header with zer
5de0: 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20  oes, as the.**  
5df0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5e00: 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e  pointer could in
5e10: 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f 74  terfere with hot
5e20: 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
5e30: 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75  k of any.**   su
5e40: 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72  bsequently inter
5e50: 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74 69  rupted transacti
5e60: 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20 74  on that reuses t
5e70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61  .**.**   The fla
5e90: 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73 20  g is cleared as 
5ea0: 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72  soon as the jour
5eb0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61  nal file is fina
5ec0: 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a  lized (either.**
5ed0: 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69     by PagerCommi
5ee0: 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67  tPhaseTwo or Pag
5ef0: 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20  erRollback). If 
5f00: 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76  an IO error prev
5f10: 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f  ents the.**   jo
5f20: 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  urnal file from 
5f30: 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c  being successful
5f40: 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  ly finalized, th
5f50: 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67  e setMaster flag
5f60: 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64  .**   is cleared
5f70: 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65   anyway (and the
5f80: 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65   pager will move
5f90: 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29   to ERROR state)
5fa0: 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69  ..**.** doNotSpi
5fb0: 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ll.**.**   This 
5fc0: 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f  variables contro
5fd0: 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  l the behavior o
5fe0: 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20 20  f cache-spills  
5ff0: 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a 2a  (calls made by.*
6000: 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20 6d  *   the pcache m
6010: 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67  odule to the pag
6020: 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74 69  erStress() routi
6030: 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63 68  ne to write cach
6040: 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f 20  ed data.**   to 
6050: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
6060: 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  in order to free
6070: 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a   up memory)..**.
6080: 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20 53  **   When bits S
6090: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72 20  PILLFLAG_OFF or 
60a0: 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
60b0: 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c 6c  CK of doNotSpill
60c0: 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20 77   are set,.**   w
60d0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
60e0: 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67 65  tabase from page
60f0: 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69 73  rStress() is dis
6100: 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65 72  abled altogether
6110: 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c 4c  ..**   The SPILL
6120: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63 61  FLAG_ROLLBACK ca
6130: 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61 20  se is done in a 
6140: 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61 73  very obscure cas
6150: 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d 65  e that.**   come
6160: 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76 65  s up during save
6170: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 74  point rollback t
6180: 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
6190: 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a 2a   pcache module.*
61a0: 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  *   to allocate 
61b0: 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70 72  a new page to pr
61c0: 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61  event the journa
61d0: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
61e0: 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 77  g written.**   w
61f0: 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e 67  hile it is being
6200: 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63 6f   traversed by co
6210: 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  de in pager_play
6220: 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50 49  back().  The SPI
6230: 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20 20  LLFLAG_OFF.**   
6240: 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20 70  case is a user p
6250: 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a  reference..** .*
6260: 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c 4c  *   If the SPILL
6270: 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74 20  FLAG_NOSYNC bit 
6280: 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67 20  is set, writing 
6290: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
62a0: 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73  from pagerStress
62b0: 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69  ().**   is permi
62c0: 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e  tted, but syncin
62d0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
62e0: 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20  le is not. This 
62f0: 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20  flag is set.**  
6300: 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
6310: 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68 65  Write() when the
6320: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63   file-system sec
6330: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
6340: 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65  er than.**   the
6350: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d 73   database page-s
6360: 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ize in order to 
6370: 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61  prevent a journa
6380: 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70  l sync from happ
6390: 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62  ening .**   in b
63a0: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63b0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63c0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63d0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63f0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
6400: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6410: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6420: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6430: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6440: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6450: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6460: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6470: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6480: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6490: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
64a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64b0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64c0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64d0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64e0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64f0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
6500: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6510: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6520: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6530: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6540: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6550: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6560: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6570: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6580: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6590: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
65a0: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65b0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65c0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65d0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65e0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65f0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
6600: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6610: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6620: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6630: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6640: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6650: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6660: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6670: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6680: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6690: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
66a0: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66b0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66c0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66d0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66e0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66f0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
6700: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6710: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6720: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6730: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6740: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6750: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6760: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6770: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6780: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6790: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
67a0: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67b0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67c0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67d0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67e0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67f0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
6800: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6810: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6820: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6830: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6840: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6850: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6860: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6870: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6880: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6890: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
68a0: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68b0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68c0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68d0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68e0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68f0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
6900: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6910: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6920: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6930: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6940: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6950: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6960: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6970: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6980: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6990: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
69a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69b0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69c0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69d0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69e0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69f0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
6a00: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a10: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a30: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a40: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a50: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a60: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a70: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a80: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a90: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6aa0: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6ab0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ac0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ad0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ae0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6af0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6b00: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b10: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b20: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b30: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b40: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b50: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b60: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b70: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b80: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b90: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6ba0: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6bb0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bc0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bd0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6be0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6bf0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6c00: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c10: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c20: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c30: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c40: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c50: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c60: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c70: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c80: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c90: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6ca0: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6cb0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cc0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cd0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6ce0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6cf0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6d00: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d10: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d20: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d40: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d50: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d60: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d70: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d80: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d90: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6da0: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6db0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6dc0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dd0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6de0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6df0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6e00: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e10: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e20: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e30: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e40: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e50: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e60: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e70: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e80: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e90: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6ea0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6eb0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6ec0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ed0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ee0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ef0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6f00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f10: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f20: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f30: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f40: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f50: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f60: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f70: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f80: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f90: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6fa0: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fb0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fc0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fd0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fe0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6ff0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
7000: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7010: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7020: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7030: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7040: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7050: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7060: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7070: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7080: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7090: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
70a0: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70b0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70c0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70d0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70e0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70f0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
7100: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7110: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7120: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7130: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7140: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7150: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7160: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7170: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7180: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7190: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
71a0: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71b0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71c0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71d0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71e0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71f0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
7200: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7210: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7220: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7240: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7250: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7260: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7270: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7280: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7290: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
72a0: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72b0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72d0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72f0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
7300: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7320: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7330: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7340: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7350: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7360: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7370: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7380: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7390: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
73a0: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73b0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73c0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73d0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73e0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
7400: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7410: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7420: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7430: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7440: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7450: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7460: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7470: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7490: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
74a0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74b0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74d0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74e0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74f0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7550: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7560: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7570: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7580: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7590: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
75a0: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75b0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75c0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75d0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75e0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75f0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
7600: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7610: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7620: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7630: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7640: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7650: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7660: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7680: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7690: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
76a0: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76b0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76c0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76d0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76e0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76f0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
7700: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7710: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7720: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7750: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7760: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7770: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
77a0: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77b0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77c0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77e0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77f0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
7800: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7810: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7820: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7830: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7840: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7850: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7860: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7870: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7880: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7890: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
78a0: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78b0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78c0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78d0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78e0: 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  nals */.  Pgno d
78f0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
7900: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7910: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
7920: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
7930: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
7940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
7950: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
7960: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
7970: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
7980: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
7990: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
79a0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
79b0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
79c0: 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65   Pgno dbHintSize
79d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
79e0: 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  Value passed to 
79f0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
7a00: 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72  call */.  int er
7a10: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
7a20: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
7a30: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
7a40: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
7a50: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
7a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
7a70: 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e  s journalled sin
7a80: 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72  ce last j-header
7a90: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33   written */.  u3
7aa0: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
7ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
7ac0: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
7ad0: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
7ae0: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32  hecksum */.  u32
7af0: 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20   nSubRec;       
7b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7b10: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72  er of records wr
7b20: 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75  itten to sub-jou
7b30: 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63  rnal */.  Bitvec
7b40: 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *pInJournal;   
7b50: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
7b60: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
7b70: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7b80: 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
7b90: 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
7ba0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7bb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61  criptor for data
7bc0: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
7bd0: 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
7be0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7bf0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69  scriptor for mai
7c00: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73  n journal */.  s
7c10: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66  qlite3_file *sjf
7c20: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  d;         /* Fi
7c30: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7c40: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  r sub-journal */
7c50: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66  .  i64 journalOf
7c60: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
7c70: 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20  * Current write 
7c80: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
7c90: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
7ca0: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7cc0: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
7cd0: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
7ce0: 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  eader */.  sqlit
7cf0: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
7d00: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
7d10: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
7d20: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
7d30: 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72  esses */.  Pager
7d40: 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65  Savepoint *aSave
7d50: 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20  point; /* Array 
7d60: 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  of active savepo
7d70: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ints */.  int nS
7d80: 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
7d90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7da0: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  of elements in a
7db0: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20  Savepoint[] */. 
7dc0: 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
7dd0: 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  [16];        /* 
7de0: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
7df0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
7e00: 68 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 75 38 20  hanges */..  u8 
7e10: 62 55 73 65 46 65 74 63 68 3b 20 20 20 20 20 20  bUseFetch;      
7e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7e30: 20 74 6f 20 75 73 65 20 78 46 65 74 63 68 28 29   to use xFetch()
7e40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 6d 61 70 4f   */.  int nMmapO
7e50: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
7e60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
7e70: 6d 61 70 20 70 61 67 65 73 20 63 75 72 72 65 6e  map pages curren
7e80: 74 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  tly outstanding 
7e90: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
7ea0: 36 34 20 73 7a 4d 6d 61 70 3b 20 20 20 20 20 20  64 szMmap;      
7eb0: 20 2f 2a 20 44 65 73 69 72 65 64 20 6d 61 78 69   /* Desired maxi
7ec0: 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65 20 2a 2f  mum mmap size */
7ed0: 0a 20 20 50 67 48 64 72 20 2a 70 4d 6d 61 70 46  .  PgHdr *pMmapF
7ee0: 72 65 65 6c 69 73 74 3b 20 20 20 20 20 20 20 2f  reelist;       /
7ef0: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 6d  * List of free m
7f00: 6d 61 70 20 70 61 67 65 20 68 65 61 64 65 72 73  map page headers
7f10: 20 28 70 44 69 72 74 79 29 20 2a 2f 0a 20 20 2f   (pDirty) */.  /
7f20: 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68  *.  ** End of th
7f30: 65 20 72 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e  e routinely-chan
7f40: 67 69 6e 67 20 63 6c 61 73 73 20 6d 65 6d 62 65  ging class membe
7f50: 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rs.  ***********
7f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7fa0: 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b  /..  u16 nExtra;
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
7fd0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
7fe0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
7ff0: 2f 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65  /.  i16 nReserve
8000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8010: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
8020: 73 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64  sed bytes at end
8030: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f   of each page */
8040: 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b  .  u32 vfsFlags;
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8060: 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  * Flags for sqli
8070: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
8080: 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53  */.  u32 sectorS
8090: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
80a0: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
80b0: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
80c0: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ollback */.  int
80d0: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
80e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
80f0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
8100: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
8110: 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  mxPgno;         
8120: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
8130: 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f  m allowed size o
8140: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
8150: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
8160: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
8170: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
8180: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
8190: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
81a0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
81c0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
81d0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
81e0: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
81f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
8200: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
8210: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28   file */.  int (
8220: 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
8230: 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69  oid*); /* Functi
8240: 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20  on to call when 
8250: 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  busy */.  void *
8260: 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
8270: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
8280: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42   argument for xB
8290: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
82a0: 69 6e 74 20 61 53 74 61 74 5b 33 5d 3b 20 20 20  int aStat[3];   
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
82c0: 6f 74 61 6c 20 63 61 63 68 65 20 68 69 74 73 2c  otal cache hits,
82d0: 20 6d 69 73 73 65 73 20 61 6e 64 20 77 72 69 74   misses and writ
82e0: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
82f0: 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e  ITE_TEST.  int n
8300: 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  Read;           
8310: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8320: 73 65 20 70 61 67 65 73 20 72 65 61 64 20 2a 2f  se pages read */
8330: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
8340: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
8350: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
8360: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
8370: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
8380: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8390: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
83a0: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
83b0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
83c0: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
83d0: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
83e0: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ata */.  void (*
83f0: 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
8400: 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20  void*,int,int); 
8410: 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67  /* Notify of pag
8420: 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a  e size changes *
8430: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
8440: 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  cFree)(void*);  
8450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
8460: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
8470: 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64   codec */.  void
8480: 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20   *pCodec;       
8490: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
84a0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
84b0: 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a  dec... methods *
84c0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
84d0: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
84e0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
84f0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
8500: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
8510: 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  use */.  PCache 
8520: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
8530: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8540: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
8550: 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ject */.#ifndef 
8560: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
8570: 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20    Wal *pWal;    
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8590: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
85a0: 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61   used by "journa
85b0: 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20  l_mode=wal" */. 
85c0: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
85e0: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72  File name for wr
85f0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f  ite-ahead log */
8600: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
8610: 2a 20 49 6e 64 65 78 65 73 20 66 6f 72 20 75 73  * Indexes for us
8620: 65 20 77 69 74 68 20 50 61 67 65 72 2e 61 53 74  e with Pager.aSt
8630: 61 74 5b 5d 2e 20 54 68 65 20 50 61 67 65 72 2e  at[]. The Pager.
8640: 61 53 74 61 74 5b 5d 20 61 72 72 61 79 20 63 6f  aStat[] array co
8650: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61  ntains.** the va
8660: 6c 75 65 73 20 61 63 63 65 73 73 65 64 20 62 79  lues accessed by
8670: 20 70 61 73 73 69 6e 67 20 53 51 4c 49 54 45 5f   passing SQLITE_
8680: 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48  DBSTATUS_CACHE_H
8690: 49 54 2c 20 43 41 43 48 45 5f 4d 49 53 53 20 0a  IT, CACHE_MISS .
86a0: 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57 52 49 54  ** or CACHE_WRIT
86b0: 45 20 74 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f  E to sqlite3_db_
86c0: 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65  status()..*/.#de
86d0: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
86e0: 48 49 54 20 20 20 30 0a 23 64 65 66 69 6e 65 20  HIT   0.#define 
86f0: 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 20  PAGER_STAT_MISS 
8700: 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   1.#define PAGER
8710: 5f 53 54 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f  _STAT_WRITE 2../
8720: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
8730: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
8740: 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72  les hold counter
8750: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
8760: 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f  sting purposes o
8770: 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69  nly.  These vari
8780: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69  ables do not exi
8790: 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74  st in.** a non-t
87a0: 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54  esting build.  T
87b0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61  hese variables a
87c0: 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61  re not thread-sa
87d0: 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  fe..*/.#ifdef SQ
87e0: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
87f0: 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
8800: 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  db_count = 0;   
8810: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
8820: 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72  ll pages read fr
8830: 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c  om DB */.int sql
8840: 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
8850: 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  db_count = 0;   
8860: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
8870: 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  l pages written 
8880: 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c  to DB */.int sql
8890: 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
88a0: 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  j_count = 0;    
88b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
88c0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  es written to jo
88d0: 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e  urnal */.# defin
88e0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20  e PAGER_INCR(v) 
88f0: 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66   v++.#else.# def
8900: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
8910: 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a  ).#endif..../*.*
8920: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
8930: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
8940: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
8950: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
8960: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
8970: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
8980: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
8990: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
89a0: 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e  check..**.** Sin
89b0: 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30  ce version 2.8.0
89c0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  , the journal fo
89d0: 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64  rmat contains ad
89e0: 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a  ditional sanity.
89f0: 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ** checking info
8a00: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
8a10: 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69   power fails whi
8a20: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
8a30: 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74  s being.** writt
8a40: 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20  en, semi-random 
8a50: 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67  garbage data mig
8a60: 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ht appear in the
8a70: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
8a80: 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20   after power is 
8a90: 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e  restored.  If an
8aa0: 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e   attempt is then
8ab0: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c   made.** to roll
8ac0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
8ad0: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
8ae0: 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74  could be corrupt
8af0: 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f  ed.  The additio
8b00: 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68  nal.** sanity ch
8b10: 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61  ecking data is a
8b20: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73  n attempt to dis
8b30: 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67  cover the garbag
8b40: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  e in the.** jour
8b50: 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  nal and ignore i
8b60: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e  t..**.** The san
8b70: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  ity checking inf
8b80: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
8b90: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   new journal for
8ba0: 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  mat consists.** 
8bb0: 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  of a 32-bit chec
8bc0: 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  ksum on each pag
8bd0: 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  e of data.  The 
8be0: 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20  checksum covers 
8bf0: 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65  both.** the page
8c00: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
8c10: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8c20: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
8c30: 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  or the page..** 
8c40: 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e  This cksum is in
8c50: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33  itialized to a 3
8c60: 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c  2-bit random val
8c70: 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ue that appears 
8c80: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8c90: 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74  l file right aft
8ca0: 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  er the header.  
8cb0: 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  The random initi
8cc0: 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74  alizer is import
8cd0: 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20  ant,.** because 
8ce0: 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61  garbage data tha
8cf0: 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65  t appears at the
8d00: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
8d10: 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64  l is likely.** d
8d20: 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63  ata that was onc
8d30: 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  e in other files
8d40: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62   that have now b
8d50: 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66  een deleted.  If
8d60: 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20   the.** garbage 
8d70: 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61  data came from a
8d80: 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  n obsolete journ
8d90: 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65  al file, the che
8da0: 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20  cksums might.** 
8db0: 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74  be correct.  But
8dc0: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
8dd0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f   the checksum to
8de0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68   random value wh
8df0: 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72  ich.** is differ
8e00: 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f  ent for every jo
8e10: 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69  urnal, we minimi
8e20: 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f  ze that risk..*/
8e30: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
8e40: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
8e50: 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a  rnalMagic[] = {.
8e60: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
8e70: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
8e80: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37  0xa1, 0x63, 0xd7
8e90: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ,.};../*.** The 
8ea0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65  size of the of e
8eb0: 61 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 20  ach page record 
8ec0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
8ed0: 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68  s given by.** th
8ee0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
8ef0: 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  o..*/.#define JO
8f00: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
8f10: 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70  er)  ((pPager->p
8f20: 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f  ageSize) + 8)../
8f30: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
8f40: 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72   header size for
8f50: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 69   this pager. Thi
8f60: 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65  s is usually the
8f70: 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61   same .** size a
8f80: 73 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  s a single disk 
8f90: 73 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f  sector. See also
8fa0: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29   setSectorSize()
8fb0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
8fc0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
8fd0: 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63  er) (pPager->sec
8fe0: 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20  torSize)../*.** 
8ff0: 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20  The macro MEMDB 
9000: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
9010: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
9020: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
9030: 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74  base..** We do t
9040: 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73  his as a macro s
9050: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51  o that if the SQ
9060: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
9070: 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c  DB macro is set,
9080: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
9090: 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61   MEMDB will be a
90a0: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68   constant and th
90b0: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
90c0: 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20  optimize.** out 
90d0: 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20  code that would 
90e0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a  never execute..*
90f0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
9100: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20  OMIT_MEMORYDB.# 
9110: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23  define MEMDB 0.#
9120: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45  else.# define ME
9130: 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  MDB pPager->memD
9140: 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  b.#endif../*.** 
9150: 54 68 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54  The macro USEFET
9160: 43 48 20 69 73 20 74 72 75 65 20 69 66 20 77 65  CH is true if we
9170: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
9180: 75 73 65 20 74 68 65 20 78 46 65 74 63 68 20 61  use the xFetch a
9190: 6e 64 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69  nd xUnfetch.** i
91a0: 6e 74 65 72 66 61 63 65 73 20 74 6f 20 61 63 63  nterfaces to acc
91b0: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
91c0: 20 75 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61   using memory-ma
91d0: 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66  pped I/O..*/.#if
91e0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
91f0: 5f 53 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65  _SIZE>0.# define
9200: 20 55 53 45 46 45 54 43 48 28 78 29 20 28 28 78   USEFETCH(x) ((x
9210: 29 2d 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65  )->bUseFetch).#e
9220: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45  lse.# define USE
9230: 46 45 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69  FETCH(x) 0.#endi
9240: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  f../*.** The max
9250: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
9260: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
9270: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
9280: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
9290: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
92a0: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * The argument t
92b0: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
92c0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
92d0: 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f  r (type sqlite3_
92e0: 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72  file*)..** Retur
92f0: 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74  n 0 if it is not
9300: 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65   open, or non-ze
9310: 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69  ro (but not 1) i
9320: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
9330: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 65  his is so that e
9340: 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
9350: 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a  e written as:.**
9360: 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e  .**   if( isOpen
9370: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
9380: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65   ....**.** inste
9390: 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66  ad of.**.**   if
93a0: 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  ( pPager->jfd->p
93b0: 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a  Methods ){ ....*
93c0: 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e  /.#define isOpen
93d0: 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d  (pFd) ((pFd)->pM
93e0: 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52  ethods)../*.** R
93f0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
9400: 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20  is pager uses a 
9410: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
9420: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
9430: 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  sual.** rollback
9440: 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77   journal. Otherw
9450: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69  ise false..*/.#i
9460: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9470: 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74  T_WAL.static int
9480: 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67   pagerUseWal(Pag
9490: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
94a0: 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70  eturn (pPager->p
94b0: 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65  Wal!=0);.}.#else
94c0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
94d0: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
94e0: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
94f0: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
9500: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
9510: 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64  s(v,w,x,y) 0.# d
9520: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
9530: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
9540: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
9550: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
9560: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
9570: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
9580: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
9590: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
95a0: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
95b0: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
95c0: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a  (pPager) );.**.*
95d0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
95e0: 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74  runs many assert
95f0: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
9600: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
9610: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72   in.** the inter
9620: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
9630: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a   Pager object..*
9640: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73  /.static int ass
9650: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
9660: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67  Pager *p){.  Pag
9670: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a  er *pPager = p;.
9680: 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74  .  /* State must
9690: 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   be valid. */.  
96a0: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
96b0: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20  e==PAGER_OPEN.  
96c0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
96d0: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a  e==PAGER_READER.
96e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
96f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9700: 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
9710: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9720: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9730: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9740: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9750: 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
9760: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9770: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
9780: 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
9790: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97a0: 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20  R_ERROR.  );..  
97b0: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
97c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
97d0: 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20  te, a temp-file 
97e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79  connection alway
97f0: 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61  s behaves.  ** a
9800: 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65  s if it has an e
9810: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
9820: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9830: 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64  le. It never upd
9840: 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68  ates.  ** the ch
9850: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
9860: 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67  ld, so the chang
9870: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
9880: 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20  is always set.. 
9890: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
98a0: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
98b0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
98c0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  IVE_LOCK );.  as
98d0: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
98e0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
98f0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9900: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9910: 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20  useJournal flag 
9920: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f  is clear, the jo
9930: 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20  urnal-mode must 
9940: 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20  be "OFF". .  ** 
9950: 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  And if the journ
9960: 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22  al-mode is "OFF"
9970: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
9980: 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  le must not be o
9990: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pen..  */.  asse
99a0: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
99b0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
99c0: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e  LMODE_OFF || p->
99d0: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
99e0: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
99f0: 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
9a00: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9a10: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29   !isOpen(p->jfd)
9a20: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
9a30: 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69  that MEMDB impli
9a40: 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61  es noSync. And a
9a50: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
9a60: 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a  nal. Since .  **
9a70: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69   this means an i
9a80: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70  n-memory pager p
9a90: 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74  erforms no IO at
9aa0: 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20   all, it cannot 
9ab0: 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  encounter .  ** 
9ac0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
9ad0: 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ERR or SQLITE_FU
9ae0: 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  LL during rollba
9af0: 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61  ck or while fina
9b00: 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a  lizing .  ** a j
9b10: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c  ournal file. (al
9b20: 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65  though the in-me
9b30: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70  mory journal imp
9b40: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
9b50: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
9b60: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
9b70: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
9b80: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
9b90: 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20  written). It .  
9ba0: 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ** is therefore 
9bb0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
9bc0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9bd0: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
9be0: 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61   ERROR .  ** sta
9bf0: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  te..  */.  if( M
9c00: 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
9c10: 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b  rt( p->noSync );
9c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9c30: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9c40: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9c50: 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  FF .         || 
9c60: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9c70: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9c80: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b  E_MEMORY .    );
9c90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9ca0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
9cb0: 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65  ROR && p->eState
9cc0: 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  !=PAGER_OPEN );.
9cd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
9ce0: 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b  rUseWal(p)==0 );
9cf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68  .  }..  /* If ch
9d00: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73  angeCountDone is
9d10: 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45 44   set, a RESERVED
9d20: 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
9d30: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20   must be held.  
9d40: 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ** on the file..
9d50: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9d60: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
9d70: 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61  ntDone==0 || pPa
9d80: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ger->eLock>=RESE
9d90: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
9da0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9db0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
9dc0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65  ..  switch( p->e
9dd0: 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  State ){.    cas
9de0: 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20  e PAGER_OPEN:.  
9df0: 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
9e00: 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  DB );.      asse
9e10: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9e20: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9e30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9e40: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
9e50: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
9e60: 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61  Cache)==0 || pPa
9e70: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
9e80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9e90: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
9ea0: 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65  ADER:.      asse
9eb0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9ec0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9ed0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9ee0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
9ef0: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
9f00: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9f10: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
9f20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9f30: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
9f40: 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20  ITER_LOCKED:.   
9f50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9f60: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
9f70: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
9f80: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
9f90: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
9fa0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65  .      if( !page
9fb0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
9fc0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9fd0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
9fe0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
9ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a000: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
a010: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze==pPager->dbOr
a020: 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  igSize );.      
a030: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a040: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a050: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a060: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a070: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a080: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a090: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a0a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a0b0: 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
a0c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a0d0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a0e0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20  TER_CACHEMOD:.  
a0f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a100: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
a110: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      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 69 66 28 20 21 70 61 67  ;.      if( !pag
a150: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a160: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
a170: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
a180: 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at if journal_mo
a190: 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74  de=wal here that
a1a0: 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20 20   neither the.   
a1b0: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
a1c0: 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c  file nor the WAL
a1d0: 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20   file are open. 
a1e0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75 72  This happens dur
a1f0: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
a200: 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
a210: 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63  ction that switc
a220: 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  hes from journal
a230: 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20  _mode=off.      
a240: 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f    ** to journal_
a250: 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20  mode=wal..      
a260: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
a270: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52  ert( p->eLock>=R
a280: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
a290: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a2a0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a2c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a2d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a2e0: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a2f0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a300: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a310: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a320: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
a330: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a340: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a350: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a360: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a370: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a380: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a390: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a3a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a3b0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a3c0: 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20  ITER_DBMOD:.    
a3d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a3e0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a3f0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a400: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a410: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a420: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a430: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a440: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a450: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a460: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a470: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a480: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a490: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a4a0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a4b0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a4c0: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a4d0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a4e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a4f0: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a500: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a510: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a520: 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize<=pPager->dbH
a530: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a540: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a550: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
a560: 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61  INISHED:.      a
a570: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a580: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a590: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a5a0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a5b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a5c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a5d0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a5e0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a5f0: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a600: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a610: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a620: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a630: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a640: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a650: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a660: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
a670: 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61     );.      brea
a680: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a690: 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  ER_ERROR:.      
a6a0: 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  /* There must be
a6b0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
a6c0: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
a6d0: 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  nce to the pager
a6e0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20   if.      ** in 
a6f0: 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
a700: 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65 72  erwise the pager
a710: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
a720: 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20  eady dropped.   
a730: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50     ** back to OP
a740: 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  EN state..      
a750: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
a760: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a770: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
a780: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
a790: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
a7a0: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
a7b0: 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62  he)>0 );.      b
a7c0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
a7d0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
a7e0: 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /* ifndef NDEBUG
a7f0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a800: 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  TE_DEBUG ./*.** 
a810: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
a820: 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64   to a human read
a830: 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61  able string in a
a840: 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a   static buffer.*
a850: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
a860: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
a870: 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
a880: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
a890: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74  . This.** is int
a8a0: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
a8b0: 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72   within debugger
a8c0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
a8d0: 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  as an alternativ
a8e0: 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a  e.** to "print *
a8f0: 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a  pPager" in gdb:.
a900: 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e  **.** (gdb) prin
a910: 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70  tf "%s", print_p
a920: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
a930: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r).*/.static cha
a940: 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  r *print_pager_s
a950: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
a960: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52    static char zR
a970: 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c  et[1024];..  sql
a980: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
a990: 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20  24, zRet,.      
a9a0: 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20  "Filename:      
a9b0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61  %s\n".      "Sta
a9c0: 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65  te:         %s e
a9d0: 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20  rrCode=%d\n".   
a9e0: 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20     "Lock:       
a9f0: 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22     %s\n".      "
aa00: 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c  Locking mode:  l
aa10: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e  ocking_mode=%s\n
aa20: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
aa30: 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f   mode:  journal_
aa40: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
aa50: 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a   "Backing store:
aa60: 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d   tempFile=%d mem
aa70: 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c  Db=%d useJournal
aa80: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%d\n".      "Jo
aa90: 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75  urnal:       jou
aaa0: 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75  rnalOff=%lld jou
aab0: 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a  rnalHdr=%lld\n".
aac0: 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20        "Size:    
aad0: 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20        dbsize=%d 
aae0: 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62  dbOrigSize=%d db
aaf0: 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20  FileSize=%d\n". 
ab00: 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e       , p->zFilen
ab10: 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ame.      , p->e
ab20: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
ab30: 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  N            ? "
ab40: 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20  OPEN" :.        
ab50: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ab60: 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20  _READER         
ab70: 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20   ? "READER" :.  
ab80: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
ab90: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
aba0: 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52  CKED   ? "WRITER
abb0: 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20  _LOCKED" :.     
abc0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
abd0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
abe0: 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41  MOD ? "WRITER_CA
abf0: 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  CHEMOD" :.      
ac00: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
ac10: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
ac20: 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d     ? "WRITER_DBM
ac30: 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  OD" :.        p-
ac40: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
ac50: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f  RITER_FINISHED ?
ac60: 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45   "WRITER_FINISHE
ac70: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
ac80: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
ac90: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20  ROR           ? 
aca0: 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f  "ERROR" : "?erro
acb0: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
acc0: 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  )p->errCode.    
acd0: 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f    , p->eLock==NO
ace0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20  _LOCK         ? 
acf0: 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20  "NO_LOCK" :.    
ad00: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45      p->eLock==RE
ad10: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20  SERVED_LOCK   ? 
ad20: 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20  "RESERVED" :.   
ad30: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45       p->eLock==E
ad40: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f  XCLUSIVE_LOCK  ?
ad50: 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20   "EXCLUSIVE" :. 
ad60: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
ad70: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20  =SHARED_LOCK    
ad80: 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20   ? "SHARED" :.  
ad90: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
ada0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20  UNKNOWN_LOCK    
adb0: 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f  ? "UNKNOWN" : "?
adc0: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
add0: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
ade0: 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a   ? "exclusive" :
adf0: 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20   "normal".      
ae00: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  , p->journalMode
ae10: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ae20: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22  ODE_MEMORY   ? "
ae30: 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20  memory" :.      
ae40: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
ae50: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ae60: 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22  ODE_OFF      ? "
ae70: 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70  off" :.        p
ae80: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ae90: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aea0: 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c  _DELETE   ? "del
aeb0: 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ete" :.        p
aec0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aed0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aee0: 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72  _PERSIST  ? "per
aef0: 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20  sist" :.        
af00: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
af10: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
af20: 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72  E_TRUNCATE ? "tr
af30: 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20  uncate" :.      
af40: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
af50: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
af60: 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22  ODE_WAL      ? "
af70: 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  wal" : "?error?"
af80: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
af90: 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29  >tempFile, (int)
afa0: 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70  p->memDb, (int)p
afb0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
afc0: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f     , p->journalO
afd0: 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64  ff, p->journalHd
afe0: 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  r.      , (int)p
aff0: 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70  ->dbSize, (int)p
b000: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69  ->dbOrigSize, (i
b010: 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65  nt)p->dbFileSize
b020: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
b030: 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
b040: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b050: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
b060: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
b070: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
b080: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
b090: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
b0a0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
b0b0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b0c0: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
b0d0: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
b0e0: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
b0f0: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
b100: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
b110: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
b120: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
b130: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
b140: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
b150: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
b160: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
b170: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
b180: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
b190: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
b1a0: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
b1b0: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
b1c0: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
b1d0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
b1e0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
b1f0: 67 65 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65  ger;.  PagerSave
b200: 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f  point *p;.  Pgno
b210: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
b220: 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  o;.  int i;.  fo
b230: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
b240: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
b250: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67  ){.    p = &pPag
b260: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
b270: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
b280: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
b290: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
b2a0: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
b2b0: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
b2c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b2d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b2e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
b2f0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
b300: 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
b310: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b320: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b330: 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50   pageInJournal(P
b340: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
b350: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
b360: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
b370: 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
b380: 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
b390: 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  gno);.}../*.** R
b3a0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
b3b0: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
b3c0: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b3d0: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
b3e0: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
b3f0: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
b400: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b410: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
b420: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
b430: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
b440: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b450: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
b460: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
b470: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
b480: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
b490: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
b4a0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b4b0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b4c0: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
b4d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
b4e0: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
b4f0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
b500: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
b510: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
b520: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b530: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
b540: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
b550: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b560: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
b570: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
b580: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
b590: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
b5a0: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
b5b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
b5c0: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
b5d0: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
b5e0: 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57  *)A,B).../*.** W
b5f0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
b600: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
b610: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
b620: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
b630: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
b640: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
b650: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b660: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b670: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
b680: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
b690: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
b6a0: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
b6b0: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
b6c0: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
b6d0: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
b6e0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
b6f0: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
b700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
b710: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b720: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b730: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b740: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
b750: 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  .** or SHARED_LO
b760: 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  CK. Regardless o
b770: 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
b780: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e   the call to xUn
b790: 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65  lock().** succee
b7a0: 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ds, set the Page
b7b0: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
b7c0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61   to match the (a
b7d0: 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f  ttempted) new lo
b7e0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  ck..**.** Except
b7f0: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b800: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b810: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b820: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
b830: 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20   called, do not 
b840: 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74  modify it. See t
b850: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
b860: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
b870: 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  .** UNKNOWN_LOCK
b880: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b890: 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  ion of this..*/.
b8a0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b8b0: 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  UnlockDb(Pager *
b8c0: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
b8d0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
b8e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
b8f0: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78  ert( !pPager->ex
b900: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
b910: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c  Pager->eLock==eL
b920: 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ock );.  assert(
b930: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
b940: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
b950: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
b960: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
b970: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
b980: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
b990: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
b9a0: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
b9b0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
b9c0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
b9d0: 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
b9e0: 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f  noLock ? SQLITE_
b9f0: 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e  OK : sqlite3OsUn
ba00: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
ba10: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
ba20: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d   pPager->eLock!=
ba30: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
ba40: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
ba50: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
ba60: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
ba70: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25  CE(("UNLOCK %p %
ba80: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
ba90: 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75  ock)).  }.  retu
baa0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bab0: 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  Lock the databas
bac0: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
bad0: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
bae0: 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52  t be either SHAR
baf0: 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45  ED_LOCK,.** RESE
bb00: 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43  RVED_LOCK or EXC
bb10: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20  LUSIVE_LOCK. If 
bb20: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75  the caller is su
bb30: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
bb40: 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b  e.** Pager.eLock
bb50: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
bb60: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bb70: 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  te. .**.** Excep
bb80: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
bb90: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
bba0: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
bbb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a  is function is .
bbc0: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bbd0: 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65  t modify it unle
bbe0: 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  ss the new locki
bbf0: 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c  ng state is EXCL
bc00: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20  USIVE_LOCK. .** 
bc10: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
bc20: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
bc30: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
bc40: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
bc50: 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73  tion .** of this
bc60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bc70: 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65  pagerLockDb(Page
bc80: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
bc90: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
bca0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
bcb0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53  assert( eLock==S
bcc0: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  HARED_LOCK || eL
bcd0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
bce0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43  CK || eLock==EXC
bcf0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
bd00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
bd10: 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67  ck<eLock || pPag
bd20: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
bd30: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  WN_LOCK ){.    r
bd40: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
bd50: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
bd60: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
bd70: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
bd80: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
bd90: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
bda0: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
bdb0: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
bdc0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
bdd0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
bde0: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bdf0: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
be00: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
be10: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
be20: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
be30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
be40: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
be50: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
be60: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
be70: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
be80: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
be90: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bea0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
beb0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bec0: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bed0: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bee0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bef0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bf00: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bf10: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bf20: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bf30: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bf40: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
bf50: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
bf60: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
bf70: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
bf80: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
bf90: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
bfa0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
bfb0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
bfc0: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
bfd0: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
bfe0: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
bff0: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
c000: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
c010: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
c020: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
c030: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
c040: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
c050: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c060: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
c070: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
c080: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c090: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
c0a0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
c0b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c0c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
c0d0: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
c0e0: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
c0f0: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
c100: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
c110: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
c120: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
c130: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
c140: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c150: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
c160: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
c170: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
c180: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
c1b0: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
c1c0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
c1d0: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
c1e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c1f0: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c200: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c230: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c240: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c250: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c260: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c270: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c280: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c290: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c2a0: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c2b0: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c2c0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c2d0: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c2e0: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c2f0: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c300: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c310: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c320: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c330: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c340: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c350: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c360: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c370: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c380: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c390: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c3a0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c3b0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c3c0: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c3d0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c3e0: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c3f0: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c400: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c410: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c420: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c430: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c440: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c450: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c460: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c470: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c480: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c490: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c4a0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c4b0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c4c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c4d0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c4e0: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c4f0: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c500: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c510: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c520: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c530: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c540: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c550: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c560: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c570: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c580: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c590: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c5a0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c5b0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c5c0: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c5d0: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c5e0: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c5f0: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c600: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c610: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c620: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c630: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c650: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c660: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c670: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c680: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c690: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c6a0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c6b0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c6c0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c6d0: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c6e0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c6f0: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c700: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c710: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c720: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c730: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c740: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c750: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c760: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c770: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c780: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c790: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c7a0: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c7b0: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c7c0: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c7d0: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c7e0: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c7f0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c800: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c810: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c820: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c830: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c840: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c850: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c860: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c870: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c880: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c890: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c8a0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c8b0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c8c0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c8d0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c8e0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c8f0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c900: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c910: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c920: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c930: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c940: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
c950: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
c960: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
c970: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
c980: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
c990: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
c9a0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
c9b0: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
c9c0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
c9d0: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
c9e0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
c9f0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
ca00: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
ca10: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
ca20: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
ca30: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
ca40: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
ca50: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
ca60: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
ca70: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
ca80: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
ca90: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
caa0: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
cab0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
cac0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cad0: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
cae0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
caf0: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
cb00: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
cb10: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
cb20: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
cb30: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
cb40: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
cb50: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
cb60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
cb70: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
cb80: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
cb90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
cba0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cbb0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cbc0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cbd0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
cbe0: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
cbf0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
cc00: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
cc10: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
cc20: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
cc30: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
cc40: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
cc50: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
cc60: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
cc70: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
cc80: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
cc90: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cca0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
ccb0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
ccc0: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
ccd0: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
cce0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
ccf0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
cd00: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
cd10: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
cd20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cd30: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cd40: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
cd50: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
cd60: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
cd70: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
cd80: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
cd90: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
cda0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
cdb0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cdc0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cdd0: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
cde0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cdf0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
ce00: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
ce10: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
ce20: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ce40: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
ce50: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
ce60: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
ce70: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
ce90: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
cea0: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
ceb0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ced0: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
cee0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cef0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cf00: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cf10: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cf20: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cf30: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cf40: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
cf50: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cf60: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cf70: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
cf80: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
cf90: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cfa0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cfb0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
cfc0: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
cfd0: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
cfe0: 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51  len==0 .   || SQ
cff0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d000: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d010: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
d020: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d030: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d040: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
d050: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
d060: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
d070: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
d080: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
d090: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d0a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d0b0: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
d0c0: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
d0d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d0e0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
d0f0: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
d100: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
d110: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d120: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
d130: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
d140: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
d150: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
d160: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
d170: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
d180: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
d190: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
d1a0: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
d1b0: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
d1c0: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
d1d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
d1e0: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
d1f0: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
d200: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
d210: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
d220: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d230: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
d240: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
d250: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
d260: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
d270: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
d280: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
d290: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
d2a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d2b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
d2c0: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
d2d0: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
d2e0: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
d2f0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d300: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
d310: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
d320: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
d330: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
d340: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
d350: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
d360: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
d370: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
d380: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
d390: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
d3a0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
d3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3d0: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
d420: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d430: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
d440: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
d450: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
d460: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
d470: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
d480: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
d490: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
d4a0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
d4b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d4c0: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
d4d0: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
d4e0: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
d4f0: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
d500: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
d510: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
d520: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
d530: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d540: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
d550: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
d560: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
d570: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
d580: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
d590: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
d5a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
d5b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
d5c0: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
d5d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d5e0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d5f0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d600: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
d610: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
d620: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
d630: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
d640: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
d650: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
d660: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
d670: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
d680: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
d690: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
d6a0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d6b0: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
d6c0: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
d6d0: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
d6e0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
d6f0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
d700: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
d710: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
d720: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
d730: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d740: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
d750: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
d760: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
d770: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
d780: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
d790: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
d7a0: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
d7b0: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d7c0: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
d7d0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d7e0: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
d7f0: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
d800: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
d810: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
d820: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
d830: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
d840: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
d850: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
d860: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
d870: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
d880: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
d890: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
d8a0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
d8b0: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
d8c0: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
d8d0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d8e0: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
d8f0: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
d900: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
d910: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
d920: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
d930: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
d940: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
d950: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
d960: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
d970: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
d980: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
d990: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
d9a0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
d9b0: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
d9c0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
d9d0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
da00: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
da10: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
da20: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
da30: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
da40: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
da50: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
da60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
da70: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
da80: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
da90: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
daa0: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
dab0: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
dac0: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
dad0: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
dae0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
daf0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
db00: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
db10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
db20: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
db30: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
db40: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
db50: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
db60: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
db70: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
db80: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
db90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dba0: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
dbb0: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
dbc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
dbd0: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
dbe0: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
dbf0: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
dc00: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
dc10: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
dc20: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
dc30: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
dc40: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
dc50: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
dc60: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
dc70: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
dc80: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
dc90: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
dca0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
dcb0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
dcc0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
dcd0: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
dce0: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
dcf0: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
dd00: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
dd10: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
dd20: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
dd30: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
dd40: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
dd50: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
dd60: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
dd70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
dd80: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
dd90: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
dda0: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
ddb0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
ddc0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
ddd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
dde0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
ddf0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
de00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
de10: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
de20: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
de30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
de40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
de50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
de60: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
de70: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
de80: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
de90: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
dea0: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
deb0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
dec0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
ded0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
dee0: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
def0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
df00: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
df10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
df20: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
df30: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
df40: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
df50: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
df60: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
df70: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
df80: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
df90: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
dfa0: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
dfb0: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
dfc0: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
dfd0: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
dfe0: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
dff0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
e000: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
e010: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
e020: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
e030: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
e040: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
e050: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
e060: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
e070: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
e080: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
e090: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
e0a0: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
e0b0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
e0c0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e0d0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
e0e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e110: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
e120: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
e130: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
e140: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
e150: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
e160: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
e170: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
e180: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
e190: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
e1a0: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
e1b0: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
e1c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e1e0: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
e1f0: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
e200: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e230: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
e240: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e250: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
e260: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
e270: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
e280: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
e290: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e2a0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
e2b0: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
e2c0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
e2d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e2e0: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
e2f0: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
e300: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
e310: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
e320: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e330: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e340: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
e350: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
e360: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
e370: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
e380: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
e390: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
e3a0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
e3b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
e3c0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e3d0: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
e3e0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e3f0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e400: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
e410: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
e420: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
e430: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
e440: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e450: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
e460: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
e470: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
e480: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
e490: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
e4a0: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e4b0: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
e4c0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
e4d0: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
e4e0: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
e4f0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
e500: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
e510: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
e520: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
e530: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
e540: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
e550: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
e560: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
e570: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
e580: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
e590: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
e5a0: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
e5b0: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
e5c0: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
e5d0: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
e5e0: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
e5f0: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
e600: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
e610: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
e620: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
e630: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
e640: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
e650: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
e660: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e670: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
e680: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
e690: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
e6a0: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
e6b0: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
e6c0: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
e6d0: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
e6e0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
e6f0: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
e700: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
e710: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
e720: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
e730: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
e740: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
e750: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
e760: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
e770: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
e780: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
e790: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
e7a0: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
e7b0: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
e7c0: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
e7d0: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e7e0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e7f0: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
e800: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
e810: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
e820: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
e830: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
e840: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e850: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
e860: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e870: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
e880: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
e890: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
e8a0: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
e8b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
e8c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
e8d0: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
e8e0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
e8f0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
e900: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
e910: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
e920: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
e930: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
e940: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
e950: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e960: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
e970: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
e980: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e990: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
e9a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
e9b0: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
e9c0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e9d0: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
e9e0: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
e9f0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
ea00: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
ea10: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
ea20: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
ea30: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
ea40: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
ea50: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
ea60: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
ea70: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
ea80: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
ea90: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
eaa0: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
eab0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
eac0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ead0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
eae0: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
eaf0: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
eb00: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
eb10: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
eb20: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
eb30: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
eb40: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eb50: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
eb60: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
eb70: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
eb80: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
eb90: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
eba0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ebb0: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
ebc0: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
ebd0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
ebe0: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
ebf0: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
ec00: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
ec10: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
ec20: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
ec30: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
ec40: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
ec50: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
ec60: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
ec70: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
ec80: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
ec90: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
eca0: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
ecb0: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
ecc0: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
ecd0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ece0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
ecf0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
ed00: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
ed10: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
ed20: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
ed30: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
ed40: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
ed50: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
ed60: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
ed70: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
ed80: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
ed90: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
eda0: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
edb0: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
edc0: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
edd0: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
ede0: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
edf0: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
ee00: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
ee10: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
ee20: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
ee30: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
ee40: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
ee50: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
ee60: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
ee70: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
ee80: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
ee90: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
eea0: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
eeb0: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
eec0: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
eed0: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
eee0: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
eef0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
ef00: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
ef10: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
ef20: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
ef30: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
ef40: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
ef50: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
ef60: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
ef70: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
ef80: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
ef90: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
efa0: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
efb0: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
efc0: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
efd0: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
efe0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
eff0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
f000: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
f010: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
f020: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
f030: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
f040: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
f050: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
f060: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
f070: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
f080: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
f090: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
f0a0: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
f0b0: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
f0c0: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
f0d0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
f0e0: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
f0f0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
f100: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
f110: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
f120: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
f130: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
f140: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
f150: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
f160: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f170: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
f180: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
f190: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f1a0: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
f1b0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f1c0: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
f1d0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
f1e0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
f1f0: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
f200: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f210: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
f220: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
f230: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
f240: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
f250: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f260: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
f270: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
f280: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
f290: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
f2a0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
f2b0: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
f2c0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f2d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f2e0: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
f2f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f300: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
f310: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
f320: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
f330: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
f340: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
f350: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
f360: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
f370: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
f380: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
f390: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
f3a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
f3b0: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
f3c0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
f3d0: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
f3e0: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
f3f0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
f400: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
f410: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
f420: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
f430: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
f440: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
f450: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
f460: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f470: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
f480: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f490: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
f4a0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
f4b0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f4c0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
f4d0: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
f4e0: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
f4f0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
f500: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
f510: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
f520: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
f530: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
f540: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
f550: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f560: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f570: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f580: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
f590: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
f5a0: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f5c0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
f5d0: 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
f5e0: 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
f5f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f600: 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
f610: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
f620: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
f630: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f640: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f650: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f660: 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
f670: 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f690: 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
f6a0: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
f6b0: 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
f6c0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
f6f0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f700: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
f710: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
f720: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
f730: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
f740: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
f750: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f760: 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
f770: 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
f780: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
f790: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
f7a0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
f7b0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
f7c0: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
f7d0: 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
f7e0: 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
f7f0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
f800: 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
f810: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
f820: 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
f830: 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
f840: 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
f850: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
f860: 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
f870: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
f880: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f890: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
f8a0: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
f8b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
f8c0: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
f8d0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
f8e0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
f8f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f900: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
f910: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
f920: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
f930: 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
f940: 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
f950: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f960: 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
f970: 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
f980: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
f990: 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
f9a0: 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
f9b0: 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
f9c0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
f9d0: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
f9e0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
f9f0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
fa00: 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
fa10: 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
fa20: 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
fa30: 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
fa40: 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
fa50: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
fa60: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
fa70: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fa80: 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
fa90: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
faa0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fab0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
fac0: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
fad0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
fae0: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
faf0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fb00: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
fb10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
fb20: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
fb30: 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
fb40: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fb50: 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
fb60: 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
fb70: 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
fb80: 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
fb90: 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
fba0: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
fbb0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
fbc0: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
fbd0: 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
fbe0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
fbf0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
fc00: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fc10: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fc20: 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
fc30: 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
fc40: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fc50: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fc60: 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
fc70: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fc80: 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
fc90: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fca0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fcb0: 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
fcc0: 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
fcd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fce0: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
fcf0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
fd00: 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
fd10: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fd20: 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
fd30: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fd40: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
fd50: 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
fd60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
fd70: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
fd80: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
fd90: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
fda0: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
fdb0: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
fdc0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
fdd0: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
fde0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fdf0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
fe00: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fe10: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
fe20: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
fe30: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fe40: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
fe50: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
fe60: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
fe70: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
fe80: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
fe90: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
fea0: 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
feb0: 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
fec0: 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
fed0: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
fee0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
fef0: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
ff00: 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
ff10: 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
ff20: 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
ff30: 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
ff40: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
ff50: 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
ff60: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
ff70: 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
ff80: 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
ff90: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
ffa0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
ffb0: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
ffc0: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
ffd0: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
ffe0: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
fff0: 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
10000 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
10010 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
10020 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
10030 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
10040 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
10050 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
10060 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
10070 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
10080 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
10090 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
100a0 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
100b0 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
100c0 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
100d0 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
100e0 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
100f0 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
10100 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
10110 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
10120 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
10130 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
10140 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
10150 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
10160 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
10170 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
10180 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
10190 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
101a0 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
101b0 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
101c0 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
101d0 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
101e0 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
101f0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
10200 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
10210 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10220 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
10230 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
10240 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
10250 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
10260 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
10270 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
10280 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10290 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
102a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
102b0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
102c0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
102d0 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
102e0 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
102f0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
10300 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
10310 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
10320 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
10330 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
10340 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
10350 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
10360 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
10370 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
10380 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
10390 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
103a0 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
103b0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
103c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
103d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
103e0 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
103f0 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
10400 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
10410 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
10420 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
10430 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
10440 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
10450 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
10460 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10470 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
10480 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
10490 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
104a0 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
104b0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
104c0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
104d0 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
104e0 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
104f0 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
10500 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
10510 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
10520 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
10530 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
10540 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
10550 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
10560 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
10570 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10580 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
10590 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
105a0 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
105b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
105c0 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
105d0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
105e0 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
105f0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
10600 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
10610 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
10620 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
10630 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
10640 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
10650 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
10660 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
10670 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
10680 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
10690 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
106a0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
106b0 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
106c0 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
106d0 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
106e0 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
106f0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
10700 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
10710 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
10720 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10730 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
10740 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
10750 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
10760 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10770 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
10780 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
10790 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
107a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
107b0 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
107c0 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
107d0 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
107e0 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
107f0 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
10800 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
10810 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
10820 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
10830 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
10840 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
10850 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
10860 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
10870 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
10880 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
10890 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
108a0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
108b0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
108c0 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
108d0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
108e0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
108f0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
10900 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
10910 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
10920 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10950 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
10960 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
10970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10980 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
10990 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
109a0 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
109c0 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
109d0 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
109e0 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
109f0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
10a00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10a10 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
10a20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
10a30 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a50 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
10a60 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
10a70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10a80 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
10a90 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
10aa0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
10ab0 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
10ac0 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
10ad0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
10ae0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10af0 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
10b00 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
10b10 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
10b20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10b30 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10b40 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10b50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10b60 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
10b70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10b80 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
10b90 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
10ba0 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
10bb0 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
10bc0 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
10bd0 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
10be0 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
10bf0 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
10c00 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
10c10 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
10c20 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10c30 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
10c40 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
10c50 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
10c60 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
10c70 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
10c80 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
10c90 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
10ca0 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
10cb0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
10cc0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10cd0 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
10ce0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
10cf0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
10d00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10d10 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10d20 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10d30 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10d40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10d50 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
10d60 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
10d70 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
10d80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10d90 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
10da0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10db0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
10dc0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
10dd0 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
10de0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10df0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10e00 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
10e10 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
10e20 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10e30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10e40 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10e50 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
10e60 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
10e70 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10e80 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10e90 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10ea0 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
10eb0 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
10ec0 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
10ed0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10ee0 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
10ef0 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
10f00 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10f10 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10f20 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
10f30 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
10f40 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10f50 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20  er+8))).  ){.   
10f60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10f70 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10f80 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72  lOff += (nMaster
10f90 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  +20);..  /* If t
10fa0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
10fb0 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
10fc0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
10fd0 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
10fe0 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
10ff0 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
11000 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
11010 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
11020 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
11030 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
11040 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
11050 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
11060 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
11070 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
11080 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
11090 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
110a0 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
110b0 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
110c0 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
110d0 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
110e0 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
110f0 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
11100 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
11110 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
11120 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
11130 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
11140 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
11150 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
11160 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
11170 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
11180 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
11190 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
111a0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
111b0 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
111c0 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
111d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
111e0 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
111f0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
11200 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
11210 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11220 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
11230 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69   rc;.}../*.** Di
11240 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65  scard the entire
11250 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
11260 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d   in-memory page-
11270 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cache..*/.static
11280 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
11290 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
112a0 7b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75  {.  sqlite3Backu
112b0 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
112c0 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c  >pBackup);.  sql
112d0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
112e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
112f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
11300 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69  all structures i
11310 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
11320 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61  epoint[] array a
11330 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50  nd set both.** P
11340 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
11350 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70  and Pager.nSavep
11360 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c  oint to zero. Cl
11370 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ose the sub-jour
11380 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  nal.** if it is 
11390 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
113a0 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63  er is not in exc
113b0 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a  lusive mode..*/.
113c0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
113d0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
113e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
113f0 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
11400 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
11410 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67  ator for looping
11420 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61   through Pager.a
11430 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66  Savepoint */.  f
11440 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
11450 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
11460 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  ii++){.    sqlit
11470 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11480 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11490 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  nt[ii].pInSavepo
114a0 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  int);.  }.  if( 
114b0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
114c0 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65  veMode || sqlite
114d0 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
114e0 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
114f0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11500 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  e(pPager->sjfd);
11510 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
11520 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76  ree(pPager->aSav
11530 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65  epoint);.  pPage
11540 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->aSavepoint = 
11550 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  0;.  pPager->nSa
11560 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
11570 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d  Pager->nSubRec =
11580 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
11590 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20   the bit number 
115a0 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65  pgno in the Page
115b0 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
115c0 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76  vepoint .** bitv
115d0 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ecs of all open 
115e0 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75  savepoints. Retu
115f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
11600 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72  successful.** or
11610 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
11620 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72   a malloc failur
11630 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  e occurs..*/.sta
11640 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76  tic int addToSav
11650 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61  epointBitvecs(Pa
11660 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
11670 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69  o pgno){.  int i
11680 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11690 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
116a0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
116b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
116c0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
116d0 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d  de */..  for(ii=
116e0 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
116f0 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
11700 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
11710 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
11720 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
11730 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  ;.    if( pgno<=
11740 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  p->nOrig ){.    
11750 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42    rc |= sqlite3B
11760 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53  itvecSet(p->pInS
11770 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b  avepoint, pgno);
11780 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
117a0 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
117b0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
117c0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
117d0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20  OMEM );.    }.  
117e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
117f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11800 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
11810 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
11820 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
11830 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e  de and not.** in
11840 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
11850 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
11860 73 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67  switches the pag
11870 65 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e  er to PAGER_OPEN
11880 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  .** state..**.**
11890 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
118a0 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
118b0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74  e-access mode, t
118c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
118d0 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c   is.** completel
118e0 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74  y unlocked. If t
118f0 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  he file is unloc
11900 6b 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ked and the file
11910 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20  -system does.** 
11920 6e 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20  not exhibit the 
11930 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
11940 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20  _OPEN property, 
11950 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11960 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69   is.** closed (i
11970 66 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a  f it is open)..*
11980 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
11990 72 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74  r is in ERROR st
119a0 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
119b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
119c0 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  , the .** conten
119d0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
119e0 63 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72  cache are discar
119f0 64 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63  ded before switc
11a00 68 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a  hing back to .**
11a10 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
11a20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   Regardless of w
11a30 68 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72  hether the pager
11a40 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
11a50 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c  -mode.** or not,
11a60 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   any journal fil
11a70 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
11a80 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62  le-system will b
11a90 65 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20  e treated.** as 
11aa0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
11ab0 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  d rolled back th
11ac0 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65  e next time a re
11ad0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  ad-transaction.*
11ae0 2a 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20  * is opened (by 
11af0 74 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f  this or by any o
11b00 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29  ther connection)
11b10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11b20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
11b30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20  ger *pPager){.. 
11b40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11b50 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
11b60 45 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c  EADER .       ||
11b70 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11b80 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20  =PAGER_OPEN .   
11b90 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
11ba0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
11bb0 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69  OR .  );..  sqli
11bc0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
11bd0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
11be0 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
11bf0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
11c00 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
11c10 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
11c20 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
11c30 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
11c40 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
11c50 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
11c60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
11c70 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
11c80 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
11c90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
11ca0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
11cb0 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  N;.  }else if( !
11cc0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
11cd0 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
11ce0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
11cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
11d00 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
11d10 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b  d by pagerUnlock
11d20 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Db() */.    int 
11d30 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61  iDc = isOpen(pPa
11d40 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33  ger->fd)?sqlite3
11d50 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
11d60 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
11d70 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  fd):0;..    /* I
11d80 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
11d90 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64  system support d
11da0 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20  eletion of open 
11db0 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20  files, then.    
11dc0 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ** close the jou
11dd0 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
11de0 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
11df0 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65  base lock.  Othe
11e00 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f  rwise.    ** ano
11e10 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
11e20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
11e30 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64  e=delete might d
11e40 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20  elete the file. 
11e50 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75     ** out from u
11e60 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a  nder us..    */.
11e70 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11e80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
11e90 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20  EMORY   & 5)!=1 
11ea0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
11eb0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11ec0 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21  E_OFF      & 5)!
11ed0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11ee0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11ef0 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20  MODE_WAL      & 
11f00 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
11f10 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11f20 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
11f30 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
11f40 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11f50 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
11f60 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ATE & 5)==1 );. 
11f70 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11f80 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
11f90 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29  RSIST  & 5)==1 )
11fa0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44  ;.    if( 0==(iD
11fb0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  c & SQLITE_IOCAP
11fc0 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
11fd0 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20  N_OPEN).     || 
11fe0 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  1!=(pPager->jour
11ff0 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20  nalMode & 5).   
12000 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12010 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
12020 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >jfd);.    }..  
12030 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
12040 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f  r is in the ERRO
12050 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12060 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  call to unlock t
12070 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
12080 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73  ** file fails, s
12090 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  et the current l
120a0 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  ock to UNKNOWN_L
120b0 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  OCK. See the com
120c0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76  ment.    ** abov
120d0 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
120e0 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  r UNKNOWN_LOCK f
120f0 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
12100 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  n of why this.  
12110 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72    ** is necessar
12120 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  y..    */.    rc
12130 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
12140 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b  (pPager, NO_LOCK
12150 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12160 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
12170 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
12180 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  R_ERROR ){.     
12190 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
121a0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20   UNKNOWN_LOCK;. 
121b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
121c0 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79   pager state may
121d0 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d   be changed from
121e0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20   PAGER_ERROR to 
121f0 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a  PAGER_OPEN here.
12200 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63      ** without c
12210 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f  learing the erro
12220 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20  r code. This is 
12230 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68  intentional - th
12240 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63  e error.    ** c
12250 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61  ode is cleared a
12260 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73  nd the cache res
12270 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  et in the block 
12280 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
12290 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
122a0 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61  ->errCode || pPa
122b0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
122c0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20  ER_ERROR );.    
122d0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
122e0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
122f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
12300 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
12310 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72  }..  /* If Pager
12320 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
12330 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12340 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12350 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20   cannot be.  ** 
12360 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
12370 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  t there are no o
12380 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
12390 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
123a0 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20  er,.  ** it can 
123b0 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b  safely move back
123c0 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   to PAGER_OPEN s
123d0 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65  tate. This happe
123e0 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20  ns in both.  ** 
123f0 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75  normal and exclu
12400 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
12410 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
12420 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
12430 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
12440 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72  MDB );.    pager
12450 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
12460 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
12470 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
12480 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
12490 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
124a0 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
124b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
124c0 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
124d0 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54  ;.    if( USEFET
124e0 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c  CH(pPager) ) sql
124f0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
12500 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
12510 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
12520 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
12530 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12540 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  lHdr = 0;.  pPag
12550 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
12560 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
12570 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12580 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20  led whenever an 
12590 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72  IOERR or FULL er
125a0 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65  ror that require
125b0 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74  s.** the pager t
125c0 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74  o transition int
125d0 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
125e0 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72  e may ahve occur
125f0 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  red..** The firs
12600 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
12610 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
12620 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
12630 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74  the second .** t
12640 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
12650 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
12660 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
12670 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  I function. The 
12680 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e  .** value return
12690 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
126a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
126b0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
126c0 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
126d0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
126e0 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55  ent is SQLITE_FU
126f0 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
12700 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a   or one of the.*
12710 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65  * IOERR sub-code
12720 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74  s, the pager ent
12730 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74  ers the ERROR st
12740 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ate and the erro
12750 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f  r code.** is sto
12760 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72  red in Pager.err
12770 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20  Code. While the 
12780 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e  pager remains in
12790 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
127a0 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41  ,.** all major A
127b0 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20  PI calls on the 
127c0 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
127d0 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61  iately return Pa
127e0 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a  ger.errCode..**.
127f0 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61  ** The ERROR sta
12800 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  te indicates tha
12810 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
12820 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
12830 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
12840 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
12850 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
12860 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
12870 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
12880 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12890 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
128a0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
128b0 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
128c0 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
128d0 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ent error occurr
128e0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
128f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
12900 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
12910 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74  replayed to rest
12920 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ore the contents
12930 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12940 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20   file (as if.** 
12950 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f  it were a hot-jo
12960 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  urnal)..*/.stati
12970 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
12980 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
12990 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
129a0 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
129b0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
129c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
129d0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a  DB );.  assert(.
129e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
129f0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
12a00 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
12a10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
12a20 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
12a30 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
12a40 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
12a50 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
12a60 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
12a70 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51  _FULL || rc2==SQ
12a80 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
12a90 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12aa0 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
12ab0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12ac0 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  ER_ERROR;.  }.  
12ad0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
12ae0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
12af0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
12b00 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
12b10 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  e);../*.** This 
12b20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
12b30 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
12b40 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
12b50 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
12b60 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
12b70 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
12b80 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
12b90 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
12ba0 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
12bb0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
12bc0 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
12bd0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12be0 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
12bf0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
12c00 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
12c10 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
12c20 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
12c30 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
12c40 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
12c50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12c60 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
12c70 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
12c80 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c  te. If it is cal
12c90 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f  led.** in PAGER_
12ca0 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48  NONE or PAGER_SH
12cb0 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74  ARED state and t
12cc0 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20  he lock held is 
12cd0 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76  less.** exclusiv
12ce0 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45  e than a RESERVE
12cf0 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20  D lock, it is a 
12d00 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  no-op..**.** Oth
12d10 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
12d20 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
12d30 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
12d40 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
12d50 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
12d60 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
12d70 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
12d80 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
12d90 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
12da0 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
12db0 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
12dc0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
12dd0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
12de0 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
12df0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
12e00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
12e10 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
12e20 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
12e30 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
12e40 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
12e50 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
12e60 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
12e70 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
12e80 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12e90 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12ea0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
12eb0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
12ec0 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
12ed0 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
12ee0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
12ef0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
12f00 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
12f10 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
12f20 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
12f30 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
12f40 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
12f50 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
12f60 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
12f70 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
12f80 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
12f90 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
12fa0 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
12fb0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
12fc0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
12fd0 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
12fe0 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
12ff0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13000 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
13010 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
13020 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
13030 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
13040 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
13050 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
13060 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
13070 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
13080 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
13090 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
130a0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
130b0 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
130c0 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
130d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
130e0 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
130f0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
13100 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
13110 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
13120 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
13130 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
13140 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
13150 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
13160 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13170 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
13180 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
13190 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
131a0 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
131b0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
131c0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
131d0 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
131e0 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
131f0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
13200 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
13210 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
13220 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
13230 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65  s finalized, the
13240 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
13250 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
13260 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e  te..** If runnin
13270 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69  g in non-exclusi
13280 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  ve rollback mode
13290 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  , the lock on th
132a0 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f  e file is .** do
132b0 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48  wngraded to a SH
132c0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
132d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
132e0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
132f0 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
13300 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
13310 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
13320 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
13330 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13340 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
13350 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
13360 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
13370 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
13380 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
13390 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
133a0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
133b0 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
133c0 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
133d0 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
133e0 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
133f0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
13400 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
13410 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13420 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
13430 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
13440 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
13450 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
13460 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
13470 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
13480 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
13490 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
134a0 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
134b0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
134c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
134d0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
134e0 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
134f0 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
13500 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  r, int bCommit){
13510 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13520 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
13530 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
13540 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
13550 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
13560 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
13570 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
13580 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
13590 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
135a0 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  eration */..  /*
135b0 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
135c0 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
135d0 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
135e0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
135f0 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73  .  ** or at leas
13600 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
13610 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
13620 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
13630 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  hen there.  ** i
13640 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
13650 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75  action active bu
13660 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  t a RESERVED or 
13670 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a  greater lock is.
13680 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20    ** held under 
13690 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
136a0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
136b0 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73  . After a succes
136c0 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  sful hot-journal
136d0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
136e0 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
136f0 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50  *      eState==P
13700 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c  AGER_NONE and eL
13710 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13720 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  OCK..  **.  **  
13730 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74   2. If a connect
13740 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ion with locking
13750 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
13760 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
13770 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20  SIVE .  **      
13780 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61  lock switches ba
13790 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ck to locking_mo
137a0 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68  de=normal and th
137b0 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20  en executes a.  
137c0 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61  **      read-tra
137d0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66  nsaction, this f
137e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
137f0 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50  d with eState==P
13800 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a  AGER_READER .  *
13810 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b  *      and eLock
13820 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13830 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74   when the read-t
13840 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
13850 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  osed..  */.  ass
13860 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
13870 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
13880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13890 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
138a0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  ER_ERROR );.  if
138b0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
138c0 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  <PAGER_WRITER_LO
138d0 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  CKED && pPager->
138e0 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c  eLock<RESERVED_L
138f0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
13900 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13910 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ..  releaseAllSa
13920 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
13930 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
13940 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13950 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
13960 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  urnal==0 );.  if
13970 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
13980 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  >jfd) ){.    ass
13990 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
139a0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
139b0 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
139c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
139d0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
139e0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
139f0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
13a00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
13a10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13a20 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13a30 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
13a40 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13a50 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
13a60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13a70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13a80 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13a90 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
13aa0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
13ab0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13ac0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
13ad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13ae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13b00 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
13b10 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
13b20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13b30 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66  _OK && pPager->f
13b40 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
13b50 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
13b60 65 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73  e the new file s
13b70 69 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  ize is written i
13b80 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69  nto the inode ri
13b90 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20  ght away..      
13ba0 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
13bb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
13bc0 68 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c  ht resurrect fol
13bd0 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c  lowing a power l
13be0 6f 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20  oss and.        
13bf0 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c    ** cause the l
13c00 61 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ast transaction 
13c10 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53  to roll back.  S
13c20 65 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ee.          ** 
13c30 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
13c40 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f  .mozilla.org/sho
13c50 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37  w_bug.cgi?id=107
13c60 32 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a  2773.          *
13c70 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
13c80 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
13c90 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
13ca0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
13cb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13cc0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
13cd0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
13ce0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13cf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13d00 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13d10 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
13d20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
13d30 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
13d40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13d50 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
13d60 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
13d70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
13d80 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
13d90 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
13da0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13db0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13dc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13dd0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
13de0 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
13df0 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
13e00 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
13e10 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
13e20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
13e30 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
13e40 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
13e50 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
13e60 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
13e70 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13e80 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
13e90 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
13ea0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
13eb0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
13ec0 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
13ed0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
13ee0 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  rnal. .      */.
13ef0 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74        int bDelet
13f00 65 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65  e = (!pPager->te
13f10 6d 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65  mpFile && sqlite
13f20 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70  3JournalExists(p
13f30 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20  Pager->jfd));.  
13f40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13f50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13f60 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13f70 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
13f80 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13f90 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13fa0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13fb0 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
13fc0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13fd0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13fe0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
13ff0 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
14000 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
14010 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
14020 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20      if( bDelete 
14030 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14040 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
14050 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
14060 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
14070 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
14080 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
14090 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
140a0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
140b0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
140c0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
140d0 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
140e0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
140f0 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
14100 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
14110 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
14120 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
14130 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Hdr *p = sqlite3
14140 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
14150 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  er, 1);.    if( 
14160 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61  p ){.      p->pa
14170 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20  geHash = 0;.    
14180 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
14190 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20  refNotNull(p);. 
141a0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
141b0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
141c0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
141d0 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
141e0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
141f0 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
14200 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c  >nRec = 0;.  sql
14210 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
14220 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
14230 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  he);.  sqlite3Pc
14240 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
14250 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
14260 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a  ager->dbSize);..
14270 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
14280 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
14290 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
142a0 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
142b0 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
142c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
142d0 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
142e0 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
142f0 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
14300 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
14310 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
14320 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
14330 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
14340 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
14350 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
14360 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
14370 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
14380 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
14390 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
143a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
143b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
143c0 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d  ommit && pPager-
143d0 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67  >dbFileSize>pPag
143e0 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
143f0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14400 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63   is taken when c
14410 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
14420 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62  saction in rollb
14430 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ack-journal.    
14440 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64  ** mode if the d
14450 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
14460 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74  disk is larger t
14470 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  han the database
14480 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41   image..    ** A
14490 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
144a0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
144b0 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
144c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
144d0 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
144e0 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20  ully committed, 
144f0 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56  but the EXCLUSIV
14500 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20  E lock is still 
14510 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20  held on the.    
14520 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69  ** file. So it i
14530 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61  s safe to trunca
14540 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
14550 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  file to its mini
14560 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  mum.    ** requi
14570 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20  red size.  */.  
14580 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14590 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
145a0 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  VE_LOCK );.    r
145b0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
145c0 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
145d0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
145e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
145f0 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
14600 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
14610 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20  ->fd) ){.    rc 
14620 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
14630 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
14640 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
14650 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c  COMMIT_PHASETWO,
14660 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
14670 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
14680 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
14690 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  K;.  }..  if( !p
146a0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
146b0 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
146c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
146d0 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
146e0 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
146f0 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
14700 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
14710 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
14720 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
14730 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
14740 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
14750 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
14760 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
14770 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
14780 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
14790 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
147a0 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
147b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
147c0 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
147d0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
147e0 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
147f0 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
14800 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
14810 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
14820 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
14830 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
14840 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
14850 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
14860 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
14870 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
14880 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
14890 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
148a0 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
148b0 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
148c0 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
148d0 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
148e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
148f0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
14900 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
14910 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
14920 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
14930 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
14940 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
14950 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
14960 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
14970 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
14980 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
14990 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
149a0 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
149b0 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
149c0 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
149d0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
149e0 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
149f0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
14a00 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
14a10 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
14a20 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
14a30 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
14a40 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
14a50 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
14a60 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
14a70 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
14a80 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
14a90 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
14aa0 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
14ab0 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
14ac0 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
14ad0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
14ae0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
14af0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
14b00 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
14b10 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14b20 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
14b30 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
14b40 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
14b50 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
14b60 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
14b70 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
14b80 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
14b90 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
14ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
14bb0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
14bc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14bd0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
14be0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
14bf0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
14c00 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
14c10 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14c20 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
14c30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14c40 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
14c50 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
14c60 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
14c70 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
14c80 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
14c90 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
14ca0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
14cb0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
14cc0 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
14cd0 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
14ce0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
14cf0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
14d00 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
14d10 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
14d20 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
14d30 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
14d40 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
14d50 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
14d60 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
14d70 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
14d80 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
14d90 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
14da0 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
14db0 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
14dc0 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
14dd0 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
14de0 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
14df0 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
14e00 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
14e10 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
14e20 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
14e30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
14e40 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
14e50 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
14e60 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
14e70 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
14e80 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
14e90 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
14ea0 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
14eb0 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
14ec0 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
14ed0 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
14ee0 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
14ef0 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
14f00 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
14f10 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
14f20 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
14f30 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
14f40 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
14f50 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
14f60 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
14f70 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
14f80 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
14f90 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
14fa0 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
14fb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
14fc0 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
14fd0 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
14fe0 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
14ff0 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
15000 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
15010 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
15020 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
15030 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
15040 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
15050 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
15060 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
15070 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
15080 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
15090 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
150a0 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
150b0 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
150c0 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
150d0 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
150e0 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
150f0 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
15100 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15110 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
15120 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
15130 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
15140 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
15150 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
15160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
15170 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
15180 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
15190 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
151a0 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
151b0 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
151c0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
151d0 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
151e0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
151f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15200 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
15210 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
15220 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
15230 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
15240 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
15250 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
15260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15270 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
15280 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
15290 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
152a0 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
152b0 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
152c0 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
152d0 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
152e0 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ec */.#endif../*
152f0 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
15300 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
15310 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
15320 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
15330 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
15340 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
15350 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
15360 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
15370 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
15380 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
15390 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
153a0 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
153b0 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
153c0 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
153d0 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
153e0 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
153f0 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
15400 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  l..**.** The mai
15410 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
15420 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d  al uses checksum
15430 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e  s - the statemen
15440 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a  t journal does .
15450 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ** not..**.** If
15460 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15470 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
15480 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
15490 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
154a0 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
154b0 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
154c0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
154d0 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
154e0 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
154f0 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
15500 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
15510 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
15520 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
15530 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
15540 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
15550 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
15560 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
15570 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
15580 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
15590 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
155a0 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
155b0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
155c0 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
155d0 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
155e0 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
155f0 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
15600 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
15610 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
15620 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
15630 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
15640 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
15650 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
15660 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
15670 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
15680 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15690 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
156a0 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
156b0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
156c0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
156d0 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
156e0 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
156f0 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
15700 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
15710 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
15720 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
15730 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
15740 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
15750 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
15760 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
15770 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
15780 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
15790 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
157a0 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
157b0 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
157c0 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
157d0 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
157e0 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
157f0 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
15800 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
15810 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
15820 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
15830 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
15840 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
15850 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
15860 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
15870 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
15880 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
15890 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
158a0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
158b0 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
158c0 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
158d0 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
158e0 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
158f0 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
15900 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
15910 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15920 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
15930 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
15940 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
15950 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
15960 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
15970 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
15980 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
15990 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
159a0 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
159b0 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
159c0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
159d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
159e0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
159f0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
15a00 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
15a10 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
15a20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
15a30 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
15a40 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66  ck */.  i64 *pOf
15a50 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  fset,           
15a60 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
15a70 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61  of record to pla
15a80 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  yback */.  Bitve
15a90 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20  c *pDone,       
15aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
15ab0 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
15ac0 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
15ad0 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
15ae0 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rnl,            
15af0 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20     /* 1 -> main 
15b00 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75  journal. 0 -> su
15b10 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
15b20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20  int isSavepnt   
15b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15b40 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65   True for a save
15b50 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a  point rollback *
15b60 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
15b70 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
15b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15b90 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
15ba0 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
15bb0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bd0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
15be0 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
15bf0 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
15c00 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
15c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15c20 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
15c30 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
15c40 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  ng */.  char *aD
15c50 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
15c60 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
15c70 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
15c80 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
15c90 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
15ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15cb0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
15cc0 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
15cd0 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
15ce0 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  isSynced;       
15cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15d00 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67  e if journal pag
15d10 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a  e is synced */..
15d20 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69    assert( (isMai
15d30 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20  nJrnl&~1)==0 ); 
15d40 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72       /* isMainJr
15d50 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nl is 0 or 1 */.
15d60 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76    assert( (isSav
15d70 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20  epnt&~1)==0 );  
15d80 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e       /* isSavepn
15d90 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  t is 0 or 1 */. 
15da0 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a   assert( isMainJ
15db0 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20  rnl || pDone ); 
15dc0 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77      /* pDone alw
15dd0 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d  ays used on sub-
15de0 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73  journals */.  as
15df0 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
15e00 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20  || pDone==0 );  
15e10 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20   /* pDone never 
15e20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65  used on non-save
15e30 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74  point */..  aDat
15e40 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  a = pPager->pTmp
15e50 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
15e60 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
15e70 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
15e80 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
15e90 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
15ea0 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
15eb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
15ec0 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61  er)==0 || (!isMa
15ed0 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65  inJrnl && isSave
15ee0 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69  pnt) );..  /* Ei
15ef0 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69  ther the state i
15f00 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
15f10 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
15f20 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74  EMOD (a transact
15f30 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76  ion .  ** or sav
15f40 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
15f50 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75  done at the requ
15f60 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  est of the calle
15f70 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20  r) or this is.  
15f80 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
15f90 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74   rollback. If it
15fa0 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
15fb0 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  l rollback, the 
15fc0 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e  pager.  ** is in
15fd0 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20   state OPEN and 
15fe0 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49  holds an EXCLUSI
15ff0 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75  VE lock. Hot-jou
16000 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  rnal rollback.  
16010 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72  ** only reads fr
16020 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
16030 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62  nal, not the sub
16040 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  -journal..  */. 
16050 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16060 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
16070 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
16080 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
16090 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
160a0 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e  OPEN && pPager->
160b0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
160c0 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73  _LOCK).  );.  as
160d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
160e0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
160f0 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69  ER_CACHEMOD || i
16100 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20  sMainJrnl );..  
16110 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
16120 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
16130 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a   data from the j
16140 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
16150 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e  urnal.  ** file.
16160 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
16170 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
16180 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ler if an IO err
16190 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a  or occurs..  */.
161a0 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72    jfd = isMainJr
161b0 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  nl ? pPager->jfd
161c0 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b   : pPager->sjfd;
161d0 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
161e0 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74  ts(jfd, *pOffset
161f0 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
16200 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16210 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
16220 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
16230 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  jfd, (u8*)aData,
16240 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16250 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29  e, (*pOffset)+4)
16260 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
16270 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
16280 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d  c;.  *pOffset +=
16290 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
162a0 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72  e + 4 + isMainJr
162b0 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nl*4;..  /* Sani
162c0 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
162d0 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
162e0 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
162f0 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
16300 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
16310 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
16320 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
16330 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
16340 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
16350 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
16360 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
16370 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
16380 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
16390 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
163a0 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
163b0 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
163c0 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
163d0 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
163e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
163f0 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
16400 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
16410 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
16420 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b  t( !isSavepnt );
16430 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16440 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
16450 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50  f( pgno>(Pgno)pP
16460 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20  ager->dbSize || 
16470 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
16480 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29  t(pDone, pgno) )
16490 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
164a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
164b0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
164c0 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
164d0 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73  its(jfd, (*pOffs
164e0 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a  et)-4, &cksum);.
164f0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
16500 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
16510 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61  !isSavepnt && pa
16520 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
16530 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63  , (u8*)aData)!=c
16540 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
16550 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
16560 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16570 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68  * If this page h
16580 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
16590 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f 72 65  played by before
165a0 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
165b0 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  ent.  ** rollbac
165c0 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f  k, then don't bo
165d0 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20  ther to play it 
165e0 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f  back again..  */
165f0 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
16600 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
16610 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
16620 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
16630 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
16640 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
16650 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
16660 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
16670 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
16680 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
16690 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
166a0 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
166b0 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
166c0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
166d0 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
166e0 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
166f0 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
16700 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
16710 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16720 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65  n CACHEMOD state
16730 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
16740 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
16750 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
16760 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
16770 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
16780 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
16790 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
167a0 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
167b0 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
167c0 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
167d0 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
167e0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
167f0 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
16800 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
16810 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16820 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
16830 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
16840 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
16850 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
16860 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
16870 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
16880 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
16890 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
168a0 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
168b0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
168c0 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
168d0 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
168e0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
168f0 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
16900 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
16910 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
16920 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
16930 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
16940 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
16950 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
16960 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57   **.  ** If in W
16970 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49  RITER_DBMOD, WRI
16980 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20  TER_FINISHED or 
16990 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e  OPEN state, then
169a0 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a 20   we update the. 
169b0 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65 20   ** pager cache 
169c0 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e 64  if it exists and
169d0 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
169e0 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
169f0 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f   marked .  ** no
16a00 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74  t dirty. Since t
16a10 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79  his code is only
16a20 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41 47   executed in PAG
16a30 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f  ER_OPEN state fo
16a40 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  r.  ** a hot-jou
16a50 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
16a60 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
16a70 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63 61  that the page-ca
16a80 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a  che is empty.  *
16a90 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
16aa0 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e  s in OPEN state.
16ab0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
16ac0 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
16ad0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
16ae0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
16af0 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
16b00 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
16b10 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
16b20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
16b30 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
16b40 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
16b50 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
16b60 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
16b70 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
16b80 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
16b90 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
16ba0 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
16bb0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
16bc0 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
16bd0 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
16be0 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
16bf0 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
16c00 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
16c10 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
16c20 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
16c30 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
16c40 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
16c50 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
16c60 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
16c70 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
16c80 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
16c90 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
16ca0 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
16cb0 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
16cc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
16cd0 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
16ce0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
16cf0 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
16d00 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
16d10 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
16d20 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
16d30 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
16d40 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
16d50 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
16d60 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
16d70 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
16d80 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
16d90 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
16da0 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
16db0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
16dc0 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
16dd0 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
16de0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16df0 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
16e00 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
16e10 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
16e20 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
16e30 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
16e40 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
16e50 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
16e60 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
16e70 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
16e80 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
16e90 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
16ea0 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
16eb0 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
16ec0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
16ed0 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
16ee0 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
16ef0 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
16f00 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
16f10 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
16f20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  opened..  */.  i
16f30 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
16f40 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50  Pager) ){.    pP
16f50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
16f60 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
16f70 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
16f80 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
16f90 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c    assert( pPg ||
16fa0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
16fb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
16fc0 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
16fd0 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50  || pPg==0 );.  P
16fe0 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59  AGERTRACE(("PLAY
16ff0 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
17000 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
17010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47  ,.           PAG
17020 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
17030 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
17040 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
17050 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ize, (u8*)aData)
17060 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73  ,.           (is
17070 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
17080 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
17090 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
170a0 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
170b0 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
170c0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
170d0 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70  | (*pOffset <= p
170e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
170f0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
17100 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67   isSynced = (pPg
17110 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
17120 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
17130 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20  ED_SYNC));.  }. 
17140 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
17150 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70  er->fd).   && (p
17160 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
17170 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
17180 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
17190 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
171a0 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a  .   && isSynced.
171b0 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
171c0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
171d0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
171e0 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ze;.    testcase
171f0 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
17200 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e  pPg!=0 && (pPg->
17210 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
17220 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20  _SYNC)!=0 );.   
17230 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
17240 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
17250 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17260 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
17270 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61  >fd, (u8 *)aData
17280 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17290 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
172a0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
172b0 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
172c0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
172d0 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
172e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
172f0 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
17300 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
17310 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
17320 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
17330 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c  OMEM);.      sql
17340 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
17350 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
17360 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
17370 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  ta);.      CODEC
17380 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
17390 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
173a0 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61  ITE_NOMEM, aData
173b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
173c0 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
173d0 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
173e0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
173f0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
17400 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
17410 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
17420 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
17430 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
17440 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
17450 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
17460 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
17470 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
17480 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
17490 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
174a0 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
174b0 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
174c0 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
174d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
174e0 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
174f0 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
17500 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
17510 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
17520 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
17530 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
17540 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
17550 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
17560 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
17570 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
17580 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
17590 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
175a0 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
175b0 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
175c0 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
175d0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
175e0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
175f0 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
17600 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
17610 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
17620 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
17630 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
17640 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
17650 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
17660 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
17670 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
17680 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
17690 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
176a0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
176b0 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
176c0 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
176d0 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
176e0 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
176f0 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
17700 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
17710 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
17720 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
17730 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
17740 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
17750 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
17760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
17770 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
17780 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  l & SPILLFLAG_RO
17790 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20  LLBACK)==0 );.  
177a0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
177b0 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
177c0 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
177d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
177e0 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
177f0 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
17800 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50  .    assert( (pP
17810 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
17820 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
17830 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20 20 20  LBACK)!=0 );.   
17840 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
17850 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41  ill &= ~SPILLFLA
17860 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
17870 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17880 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
17890 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d     pPg->flags &=
178a0 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
178b0 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  D;.    sqlite3Pc
178c0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
178d0 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  g);.  }.  if( pP
178e0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
178f0 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
17900 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
17910 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
17920 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
17930 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
17940 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
17950 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
17960 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
17970 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
17980 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
17990 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
179a0 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
179b0 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
179c0 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
179d0 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
179e0 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
179f0 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
17a00 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
17a10 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
17a20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
17a30 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61   *pData;.    pDa
17a40 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
17a50 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
17a60 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  a, (u8*)aData, p
17a70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
17a80 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52  ;.    pPager->xR
17a90 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
17aa0 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
17ab0 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20   && (!isSavepnt 
17ac0 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61  || *pOffset<=pPa
17ad0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
17ae0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
17af0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
17b00 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a  this page were j
17b10 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ust restored fro
17b20 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20  m the main .    
17b30 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
17b40 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74  e, then its cont
17b50 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74  ent must be as t
17b60 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68  hey were when th
17b70 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  e .      ** tran
17b80 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73  saction was firs
17b90 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  t opened. In thi
17ba0 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61  s case we can ma
17bb0 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rk the page.    
17bc0 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73    ** as clean, s
17bd0 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20  ince there will 
17be0 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72  be no need to wr
17bf0 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
17c00 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
17c10 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ase..      **.  
17c20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
17c30 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
17c40 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
17c50 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
17c60 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
17c70 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
17c80 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
17c90 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
17ca0 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
17cb0 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
17cc0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
17cd0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
17ce0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
17cf0 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
17d00 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
17d10 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
17d20 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
17d30 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
17d40 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
17d50 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
17d60 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
17d70 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
17d80 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
17d90 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
17da0 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
17db0 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
17dc0 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
17dd0 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
17de0 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
17df0 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
17e00 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
17e10 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
17e20 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
17e30 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
17e40 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
17e50 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
17e60 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17e70 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
17e80 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
17e90 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
17ea0 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
17eb0 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
17ec0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
17ed0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
17ee0 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
17ef0 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
17f00 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
17f10 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
17f20 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
17f30 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
17f40 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
17f50 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
17f60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
17f70 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
17f80 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
17f90 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
17fa0 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
17fb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
17fc0 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
17fd0 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  g);..    /* If t
17fe0 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
17ff0 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
18000 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
18010 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
18020 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
18030 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
18040 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
18050 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
18060 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
18070 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
18080 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
18090 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
180a0 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
180b0 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
180c0 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
180d0 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
180e0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
180f0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
18100 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
18110 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  MEM);.    sqlite
18120 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
18130 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
18140 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
18150 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
18160 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
18170 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
18180 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
18190 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
181a0 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
181b0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
181c0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
181d0 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
181e0 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
181f0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
18200 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
18210 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
18220 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
18230 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
18240 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
18250 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
18260 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
18270 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
18280 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
18290 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
182a0 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
182b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
182c0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
182d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
182e0 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
182f0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
18300 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
18310 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
18320 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
18330 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
18340 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
18350 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
18360 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
18370 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
18380 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
18390 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
183a0 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
183b0 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
183c0 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
183d0 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
183e0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
183f0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
18400 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
18410 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
18420 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
18430 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
18440 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
18450 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
18460 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
18470 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18480 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
18490 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
184a0 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
184b0 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
184c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
184d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
184e0 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
184f0 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
18500 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
18510 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
18520 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
18530 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
18540 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
18550 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
18560 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
18570 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
18580 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
18590 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
185a0 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
185b0 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
185c0 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
185d0 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
185e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
185f0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
18600 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
18610 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
18620 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
18630 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
18640 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
18650 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
18660 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
18670 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
18680 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
18690 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
186a0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
186b0 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
186c0 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
186d0 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
186e0 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
186f0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
18700 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
18710 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
18720 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
18730 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
18740 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
18750 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
18760 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
18770 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
18780 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
18790 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
187a0 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
187b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
187c0 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
187d0 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
187e0 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
187f0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
18800 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
18810 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
18820 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
18830 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
18840 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
18850 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
18860 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
18870 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
18880 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
18890 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
188a0 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
188b0 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
188c0 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
188d0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
188e0 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
188f0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
18900 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
18910 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
18920 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
18930 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
18940 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
18950 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
18960 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
18970 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
18980 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
18990 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
189a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
189b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
189c0 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
189d0 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
189e0 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
189f0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
18a00 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
18a10 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
18a20 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
18a30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
18a40 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
18a50 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
18a60 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
18a70 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
18a80 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
18a90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
18aa0 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e  ter to one journ
18ab0 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c  al within MJ fil
18ac0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
18ad0 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
18ae0 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
18af0 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72  d MJ filename fr
18b00 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  om a journal fil
18b10 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
18b20 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20  erPtr;          
18b30 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70   /* Amount of sp
18b40 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ace allocated to
18b50 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f   zMasterPtr[] */
18b60 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
18b70 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74  space for both t
18b80 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  he pJournal and 
18b90 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73  pMaster file des
18ba0 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49  criptors..  ** I
18bb0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70  f successful, op
18bc0 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
18bd0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72  urnal file for r
18be0 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70  eading..  */.  p
18bf0 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
18c00 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
18c10 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d  MallocZero(pVfs-
18c20 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
18c30 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
18c40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
18c50 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
18c60 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
18c70 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
18c80 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
18c90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
18ca0 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
18cb0 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
18cc0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
18cd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
18ce0 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
18cf0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
18d00 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
18d10 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
18d20 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
18d30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18d40 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18d50 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  ut;..  /* Load t
18d60 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
18d70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
18d80 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
18d90 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69  d from.  ** sqli
18da0 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
18db0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
18dc0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20  MasterJournal.  
18dd0 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a   Also obtain.  *
18de0 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  * sufficient spa
18df0 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74  ce (in zMasterPt
18e00 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  r) to hold the n
18e10 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20  ames of master. 
18e20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
18e30 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
18e40 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63   regular rollbac
18e50 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  k-journals..  */
18e60 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
18e70 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
18e80 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
18e90 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
18ea0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
18eb0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
18ec0 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56   nMasterPtr = pV
18ed0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
18ee0 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
18ef0 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  al = sqlite3Mall
18f00 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  oc(nMasterJourna
18f10 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b  l + nMasterPtr +
18f20 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73   1);.  if( !zMas
18f30 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
18f40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18f50 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65  MEM;.    goto de
18f60 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d  lmaster_out;.  }
18f70 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  .  zMasterPtr = 
18f80 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
18f90 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
18fa0 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ];.  rc = sqlite
18fb0 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
18fc0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
18fd0 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
18fe0 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20  rnal, 0);.  if( 
18ff0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19000 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19010 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  ut;.  zMasterJou
19020 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
19030 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f  nal] = 0;..  zJo
19040 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
19050 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28  ournal;.  while(
19060 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
19070 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
19080 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
19090 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
190a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
190b0 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
190c0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
190d0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
190e0 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sts);.    if( rc
190f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19100 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
19110 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
19120 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
19130 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  .      /* One of
19140 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
19150 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
19160 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
19170 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  xists..      ** 
19180 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
19190 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
191a0 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
191b0 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a  rnal. If.      *
191c0 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
191d0 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting 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 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
19200 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
19210 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
19220 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
19230 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
19240 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
19250 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19260 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
19270 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
19280 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
19290 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
192a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
192b0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
192c0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
192d0 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
192e0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
192f0 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
19300 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
19310 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
19320 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
19330 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19340 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19350 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19360 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
19370 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
19380 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
19390 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
193a0 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
193b0 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
193c0 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
193d0 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
193e0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
193f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
19400 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19410 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19420 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
19430 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
19440 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
19450 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a  rnal)+1);.  }. .
19460 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
19470 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20  (pMaster);.  rc 
19480 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
19490 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
194a0 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
194b0 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
194c0 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
194d0 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74  al);.  if( pMast
194e0 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
194f0 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
19500 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
19510 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
19520 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
19530 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
19540 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19550 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
19560 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
19570 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63  to change the ac
19580 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
19590 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
195a0 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
195b0 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79  ystem. This only
195c0 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
195d0 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
195e0 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f  action,.** or ro
195f0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
19600 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64  nsaction (includ
19610 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ing rolling back
19620 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
19630 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  .**.** If the ma
19640 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
19650 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
19660 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
19670 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44  t in either.** D
19680 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  BMOD or OPEN sta
19690 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
196a0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  n is a no-op. Ot
196b0 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a  herwise, the siz
196c0 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c  e .** of the fil
196d0 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
196e0 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61  nPage pages (nPa
196f0 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ge*pPager->pageS
19700 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20  ize bytes). .** 
19710 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  If the file on d
19720 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
19730 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
19740 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
19750 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
19760 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
19770 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
19780 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
19790 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
197a0 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e  that the file on
197b0 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72   disk is smaller
197c0 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20   than .** nPage 
197d0 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72  pages. Some oper
197e0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70  ating system imp
197f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e  lementations can
19800 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66   get confused if
19810 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20   .** you try to 
19820 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20  truncate a file 
19830 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61  to some size tha
19840 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
19850 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   it .** currentl
19860 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20  y is, so detect 
19870 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72  this case and wr
19880 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72  ite a single zer
19890 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68  o byte to .** th
198a0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77  e end of the new
198b0 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a   file instead..*
198c0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
198d0 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ul, return SQLIT
198e0 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65  E_OK. If an IO e
198f0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
19900 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74  e modifying.** t
19910 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19920 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
19930 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
19940 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
19950 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
19960 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
19970 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
19980 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19990 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
199a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
199b0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
199c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
199d0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52  >eState!=PAGER_R
199e0 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66  EADER );.  .  if
199f0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
19a00 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61  >fd) .   && (pPa
19a10 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
19a20 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
19a30 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
19a40 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a  e==PAGER_OPEN) .
19a50 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72    ){.    i64 cur
19a60 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a  rentSize, newSiz
19a70 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  e;.    int szPag
19a80 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
19a90 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74  Size;.    assert
19aa0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
19ab0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
19ac0 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  );.    /* TODO: 
19ad0 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73  Is it safe to us
19ae0 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  e Pager.dbFileSi
19af0 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20  ze here? */.    
19b00 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
19b10 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
19b20 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29  d, &currentSize)
19b30 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
19b40 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67  szPage*(i64)nPag
19b50 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
19b60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
19b70 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
19b80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
19b90 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
19ba0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
19bb0 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
19bc0 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
19bd0 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
19be0 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72 72 65  }else if( (curre
19bf0 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d  ntSize+szPage)<=
19c00 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
19c10 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20     char *pTmp = 
19c20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
19c30 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e;.        memse
19c40 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67  t(pTmp, 0, szPag
19c50 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
19c60 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
19c70 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e  zPage) == curren
19c80 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
19c90 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
19ca0 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63  ize-szPage) >  c
19cb0 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
19cc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19cd0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
19ce0 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61  ->fd, pTmp, szPa
19cf0 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61  ge, newSize-szPa
19d00 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
19d10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19d20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19d30 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
19d40 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
19d50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
19d60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19d70 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61 6e  .** Return a san
19d80 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  itized version o
19d90 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  f the sector-siz
19da0 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46 69  e of OS file pFi
19db0 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  le. The.** retur
19dc0 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61 72 61  n value is guara
19dd0 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65 74  nteed to lie bet
19de0 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f  ween 32 and MAX_
19df0 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a  SECTOR_SIZE..*/.
19e00 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74 6f  int sqlite3Secto
19e10 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
19e20 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
19e30 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65 33  t iRet = sqlite3
19e40 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46 69  OsSectorSize(pFi
19e50 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74 3c  le);.  if( iRet<
19e60 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20 3d  32 ){.    iRet =
19e70 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66   512;.  }else if
19e80 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f  ( iRet>MAX_SECTO
19e90 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
19ea0 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
19eb0 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
19ec0 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45 43    iRet = MAX_SEC
19ed0 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20  TOR_SIZE;.  }.  
19ee0 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a  return iRet;.}..
19ef0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
19f00 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  lue of the Pager
19f10 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
19f20 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76  able for the giv
19f30 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65  en.** pager base
19f40 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72  d on the value r
19f50 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
19f60 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f  SectorSize metho
19f70 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e  d.** of the open
19f80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19f90 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
19fa0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
19fb0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
19fc0 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
19fd0 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
19fe0 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
19ff0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
1a000 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
1a010 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
1a020 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
1a030 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
1a040 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1a050 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
1a060 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
1a070 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
1a080 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
1a090 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
1a0a0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1a0b0 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
1a0c0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
1a0d0 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
1a0e0 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
1a0f0 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74  p to 32 if.** it
1a100 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32   is less than 32
1a110 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
1a120 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
1a130 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
1a140 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
1a150 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
1a160 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
1a170 20 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f   has the SQLITE_
1a180 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1a190 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72  OVERWRITE proper
1a1a0 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20  ty, then set.** 
1a1b0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1a1c0 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73  ctor size to its
1a1d0 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28   minimum value (
1a1e0 35 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f  512).  The purpo
1a1f0 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d  se of.** pPager-
1a200 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74  >sectorSize is t
1a210 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c  o define the "bl
1a220 61 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62  ast radius" of b
1a230 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67  ytes that.** mig
1a240 68 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63  ht change if a c
1a250 72 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c  rash occurs whil
1a260 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73  e writing to a s
1a270 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a  ingle byte in.**
1a280 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75   that range.  Bu
1a290 74 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45  t with POWERSAFE
1a2a0 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20  _OVERWRITE, the 
1a2b0 62 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20  blast radius is 
1a2c0 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73  zero.** (that is
1a2d0 20 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f   what POWERSAFE_
1a2e0 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29  OVERWRITE means)
1a2f0 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65  , so we minimize
1a300 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73   the sector.** s
1a310 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61  ize.  For backwa
1a320 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
1a330 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  y of the rollbac
1a340 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  k journal file f
1a350 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e  ormat,.** we can
1a360 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65  not reduce the e
1a370 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1a380 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a  size below 512..
1a390 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1a3a0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
1a3b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
1a3c0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1a3d0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1a3e0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1a3f0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1a400 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28  tempFile.   || (
1a410 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
1a420 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
1a430 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20  Pager->fd) & .  
1a440 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1a450 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1a460 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30  FE_OVERWRITE)!=0
1a470 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  .  ){.    /* Sec
1a480 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
1a490 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
1a4a0 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
1a4b0 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
1a4c0 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
1a4d0 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
1a4e0 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
1a4f0 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
1a500 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
1a510 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a  ll segfault. */.
1a520 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
1a530 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
1a540 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
1a550 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
1a560 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a  sqlite3SectorSiz
1a570 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
1a580 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
1a590 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
1a5a0 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
1a5b0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
1a5c0 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
1a5d0 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
1a5e0 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
1a5f0 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
1a600 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
1a610 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
1a620 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
1a630 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
1a640 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
1a650 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
1a660 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
1a670 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1a680 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1a690 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1a6a0 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
1a6b0 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
1a6c0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
1a6d0 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
1a6e0 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
1a6f0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
1a700 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
1a710 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
1a720 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
1a730 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
1a740 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1a750 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1a760 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
1a770 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
1a780 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
1a790 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
1a7a0 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
1a7b0 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
1a7c0 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
1a7d0 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
1a7e0 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
1a7f0 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
1a800 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
1a810 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1a820 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1a830 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54   sector size.  T
1a840 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  he header.**    
1a850 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20     is this many 
1a860 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
1a870 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62  *  (6)  4 byte b
1a880 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1a890 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70  r which is the p
1a8a0 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37  age size..**  (7
1a8b0 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20  )  zero padding 
1a8c0 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  out to the next 
1a8d0 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20  sector size..** 
1a8e0 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (8)  Zero or mo
1a8f0 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
1a900 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
1a910 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
1a920 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
1a930 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
1a940 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
1a950 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
1a960 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
1a970 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
1a980 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
1a990 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
1a9a0 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
1a9b0 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69  an the first 7 i
1a9c0 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
1a9d0 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
1a9e0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
1a9f0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38  nstance of the 8
1aa00 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
1aa10 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
1aa20 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
1aa30 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
1aa40 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
1aa50 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
1aa60 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
1aa70 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
1aa80 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
1aa90 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
1aaa0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
1aab0 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
1aac0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1aad0 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
1aae0 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
1aaf0 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
1ab00 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
1ab10 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
1ab20 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
1ab30 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
1ab40 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1ab50 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
1ab60 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
1ab70 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
1ab80 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
1ab90 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
1aba0 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
1abb0 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
1abc0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
1abd0 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
1abe0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
1abf0 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
1ac00 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
1ac10 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
1ac20 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
1ac30 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
1ac40 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
1ac50 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
1ac60 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
1ac70 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
1ac80 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
1ac90 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
1aca0 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
1acb0 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
1acc0 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
1acd0 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
1ace0 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
1acf0 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
1ad00 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
1ad10 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
1ad20 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
1ad30 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
1ad40 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
1ad50 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
1ad60 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
1ad70 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
1ad80 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
1ad90 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
1ada0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
1adb0 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
1adc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
1add0 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
1ade0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1adf0 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
1ae00 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
1ae10 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
1ae20 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
1ae30 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
1ae40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
1ae50 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
1ae60 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
1ae70 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
1ae80 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
1ae90 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
1aea0 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
1aeb0 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
1aec0 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
1aed0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
1aee0 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
1aef0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
1af00 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
1af10 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
1af20 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
1af30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1af40 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61  .** The isHot pa
1af50 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
1af60 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72  s that we are tr
1af70 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ying to rollback
1af80 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68   a journal.** th
1af90 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f  at might be a ho
1afa0 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20  t journal.  Or, 
1afb0 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74  it could be that
1afc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1afd0 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65  .** preserved be
1afe0 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c  cause of JOURNAL
1aff0 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20  MODE_PERSIST or 
1b000 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
1b010 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20  CATE..** If the 
1b020 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69  journal really i
1b030 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65  s hot, reset the
1b040 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69   pager cache pri
1b050 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61  or rolling.** ba
1b060 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20  ck any content. 
1b070 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1b080 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73  is merely persis
1b090 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69  tent, no reset i
1b0a0 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s.** needed..*/.
1b0b0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1b0c0 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
1b0d0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
1b0e0 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ot){.  sqlite3_v
1b0f0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
1b100 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73  r->pVfs;.  i64 s
1b110 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
1b120 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1b130 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b140 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
1b150 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
1b160 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b170 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
1b180 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
1b190 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
1b1a0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
1b1b0 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
1b1c0 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  r */.  Pgno mxPg
1b1d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1b1e0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
1b1f0 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20  riginal file in 
1b200 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  pages */.  int r
1b210 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1b220 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1b230 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
1b240 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  ne */.  int res 
1b250 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1b260 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
1b270 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41  ed by sqlite3OsA
1b280 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61  ccess() */.  cha
1b290 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
1b2a0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1b2b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b2c0 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20  file if any */. 
1b2d0 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65   int needPagerRe
1b2e0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  set;      /* Tru
1b2f0 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20  e to reset page 
1b300 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70  prior to first p
1b310 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  age rollback */.
1b320 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20    int nPlayback 
1b330 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f  = 0;       /* To
1b340 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
1b350 67 65 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ges restored fro
1b360 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20  m journal */..  
1b370 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
1b380 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
1b390 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
1b3a0 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
1b3b0 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
1b3c0 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
1b3d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
1b3e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
1b3f0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
1b400 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1b410 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
1b420 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1b430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
1b440 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1b450 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
1b460 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1b470 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
1b480 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
1b490 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
1b4a0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1b4b0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
1b4c0 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
1b4d0 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
1b4e0 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
1b4f0 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
1b500 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
1b510 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
1b520 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
1b530 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  ayed back..  **.
1b540 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e    ** TODO: Techn
1b550 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  ically the follo
1b560 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72  wing is an error
1b570 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75   because it assu
1b580 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75  mes that.  ** bu
1b590 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53  ffer Pager.pTmpS
1b5a0 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e  pace is (mxPathn
1b5b0 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20  ame+1) bytes or 
1b5c0 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61  larger. i.e. tha
1b5d0 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e  t.  ** (pPager->
1b5e0 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67  pageSize >= pPag
1b5f0 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1b600 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f  name+1). Using o
1b610 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20  s_unix.c,.  **  
1b620 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31  mxPathname is 51
1b630 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  2, which is the 
1b640 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69  same as the mini
1b650 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61  mum allowable va
1b660 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67  lue.  ** for pag
1b670 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d  eSize..  */.  zM
1b680 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
1b690 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
1b6a0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1b6b0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1b6c0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1b6d0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1b6e0 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
1b6f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
1b700 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
1b710 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1b720 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
1b730 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
1b740 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
1b750 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
1b760 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
1b770 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
1b780 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1b790 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
1b7a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b7b0 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61  ff = 0;.  needPa
1b7c0 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74  gerReset = isHot
1b7d0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
1b7e0 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
1b7f0 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a  her when a readJ
1b800 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a  ournalHdr() or .
1b810 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
1b820 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63  ack_one_page() c
1b830 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49  all returns SQLI
1b840 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
1b850 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63   error .  ** occ
1b860 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  urs. .  */.  whi
1b870 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20  le( 1 ){.    /* 
1b880 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
1b890 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
1b8a0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
1b8b0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
1b8c0 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
1b8d0 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
1b8e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1b8f0 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
1b900 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
1b910 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
1b920 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
1b930 65 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61  ess must have fa
1b940 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
1b950 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
1b960 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
1b970 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
1b980 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1b990 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
1b9a0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
1b9b0 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c  r(pPager, isHot,
1b9c0 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
1b9d0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
1b9e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
1b9f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ba00 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1ba10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ba20 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1ba30 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1ba40 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
1ba50 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
1ba60 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
1ba70 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
1ba80 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
1ba90 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
1baa0 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
1bab0 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
1bac0 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
1bad0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
1bae0 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
1baf0 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
1bb00 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
1bb10 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
1bb20 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
1bb30 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
1bb40 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
1bb50 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
1bb60 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1bb70 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
1bb80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1bb90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
1bba0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1bbb0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
1bbc0 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1bbd0 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
1bbe0 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
1bbf0 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
1bc00 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1bc10 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
1bc20 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
1bc30 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
1bc40 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
1bc50 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
1bc60 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69  ss and if this i
1bc70 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64  s the final head
1bc80 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  er in the journa
1bc90 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  l, then it means
1bca0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69  .    ** that thi
1bcb0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f  s part of the jo
1bcc0 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
1bcd0 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e  filled but has n
1bce0 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20  ot yet been.    
1bcf0 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
1bd00 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20  k.  Compute the 
1bd10 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1bd20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d  based on the rem
1bd30 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69  aining.    ** si
1bd40 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ze of the file..
1bd50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1bd60 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20  e third term of 
1bd70 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64  the test was add
1bd80 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74  ed to fix ticket
1bd90 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57   #2565..    ** W
1bda0 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
1bdb0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20   a hot journal, 
1bdc0 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d  nRec==0 always m
1bdd0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65  eans that the ne
1bde0 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20  xt.    ** chunk 
1bdf0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63  of the journal c
1be00 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67  ontains zero pag
1be10 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  es to be rolled 
1be20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a  back.  But.    *
1be30 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52  * when doing a R
1be40 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20  OLLBACK and the 
1be50 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73  nRec==0 chunk is
1be60 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20   the last chunk 
1be70 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
1be80 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20  urnal, it means 
1be90 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1bea0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
1beb0 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a  dditional.    **
1bec0 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64   pages that need
1bed0 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1bee0 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
1bef0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1bf00 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62  .    ** should b
1bf10 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64  e computed based
1bf20 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
1bf30 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  file size..    *
1bf40 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
1bf50 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20  0 && !isHot &&. 
1bf60 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1bf70 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
1bf80 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1bf90 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
1bfa0 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  lOff ){.      nR
1bfb0 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1bfc0 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
1bfd0 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
1bfe0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
1bff0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1c000 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1c010 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
1c020 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1c030 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1c040 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1c050 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
1c060 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
1c070 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
1c080 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1c090 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
1c0a0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1c0b0 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
1c0c0 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
1c0d0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
1c0e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1c0f0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1c100 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1c110 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
1c120 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
1c130 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
1c140 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
1c150 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
1c160 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
1c170 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
1c180 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
1c190 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
1c1a0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
1c1b0 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
1c1c0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50  .      if( needP
1c1d0 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20  agerReset ){.   
1c1e0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
1c1f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1c200 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1c210 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1c220 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1c230 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1c240 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d  (pPager,&pPager-
1c250 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c  >journalOff,0,1,
1c260 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1c270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c280 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b         nPlayback
1c290 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
1c2a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1c2b0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1c2c0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1c2d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
1c2e0 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
1c2f0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1c300 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
1c310 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1c320 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
1c330 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
1c340 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63  l has been trunc
1c350 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f  ated, simply sto
1c360 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20  p reading and.  
1c370 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1c380 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ssing the journa
1c390 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  l. This might ha
1c3a0 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72  ppen if the jour
1c3b0 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  nal was.        
1c3c0 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74    ** not complet
1c3d0 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20  ely written and 
1c3e0 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20  synced prior to 
1c3f0 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61  a crash.  In tha
1c400 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
1c410 61 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ase, the databas
1c420 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65  e should have ne
1c430 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
1c440 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
1c450 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65    ** first place
1c460 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20   so it is OK to 
1c470 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74  simply abandon t
1c480 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a  he rollback. */.
1c490 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1c4a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1c4b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1c4c0 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1c4d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1c4e0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  /* If we are una
1c4f0 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ble to rollback,
1c500 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e   quit and return
1c510 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20   the error.     
1c520 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54       ** code.  T
1c530 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
1c540 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
1c550 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
1c560 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
1c570 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65  o that no furthe
1c580 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64  r harm will be d
1c590 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68  one.  Perhaps th
1c5a0 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20  e next.         
1c5b0 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63   ** process to c
1c5c0 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62  ome along will b
1c5d0 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
1c5e0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ck the database.
1c5f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1c600 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1c610 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1c620 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c630 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
1c640 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
1c650 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
1c660 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f  back:.  /* Follo
1c670 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  wing a rollback,
1c680 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c690 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63  le should be bac
1c6a0 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61  k in its origina
1c6b0 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69  l.  ** state pri
1c6c0 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
1c6d0 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
1c6e0 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68  on, so invoke th
1c6f0 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43  e.  ** SQLITE_FC
1c700 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1c710 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65   file-control me
1c720 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20  thod to disable 
1c730 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69  the.  ** asserti
1c740 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  on that the tran
1c750 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1c760 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20  was modified..  
1c770 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1c780 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
1c790 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
1c7a0 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
1c7b0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
1c7c0 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  t(pPager->fd,SQL
1c7d0 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1c7e0 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23  HANGED,0);.  }.#
1c7f0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
1c800 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20  his playback is 
1c810 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61  happening automa
1c820 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73  tically as a res
1c830 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20  ult of an IO or 
1c840 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  .  ** malloc err
1c850 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  or that occurred
1c860 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
1c870 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  e-counter was up
1c880 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20  dated but .  ** 
1c890 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
1c8a0 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69  action was commi
1c8b0 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63  tted, then the c
1c8c0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20  hange-counter . 
1c8d0 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e   ** modification
1c8e0 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62   may just have b
1c8f0 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66  een reverted. If
1c900 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   this happens in
1c910 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a   exclusive .  **
1c920 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73   mode, then subs
1c930 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69  equent transacti
1c940 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79  ons performed by
1c950 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1c960 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70  will not.  ** up
1c970 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
1c980 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20  counter at all. 
1c990 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f  This may lead to
1c9a0 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74   cache inconsist
1c9b0 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65  ency.  ** proble
1c9c0 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f  ms for other pro
1c9d0 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70  cesses at some p
1c9e0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
1c9f0 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a  re. So, just.  *
1ca00 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68  * in case this h
1ca10 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65  as happened, cle
1ca20 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  ar the changeCou
1ca30 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e  ntDone flag now.
1ca40 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1ca50 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1ca60 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
1ca70 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  le;..  if( rc==S
1ca80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ca90 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
1caa0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
1cab0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1cac0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1cad0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1cae0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1caf0 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74  thname+1);.    t
1cb00 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1cb10 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
1cb20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cb30 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  K.   && (pPager-
1cb40 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
1cb50 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
1cb60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1cb70 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a  AGER_OPEN).  ){.
1cb80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1cb90 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72  PagerSync(pPager
1cba0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
1cbb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1cbc0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1cbd0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
1cbe0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b  pPager, zMaster[
1cbf0 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20  0]!='\0', 0);.  
1cc00 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1cc10 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1cc20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1cc30 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1cc40 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  0] && res ){.   
1cc50 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
1cc60 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1cc70 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
1cc80 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
1cc90 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
1cca0 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
1ccb0 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
1ccc0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1ccd0 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  l..    */.    rc
1cce0 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
1ccf0 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  er(pPager, zMast
1cd00 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  er);.    testcas
1cd10 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1cd20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   );.  }.  if( is
1cd30 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63 6b  Hot && nPlayback
1cd40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1cd50 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43  log(SQLITE_NOTIC
1cd60 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41  E_RECOVER_ROLLBA
1cd70 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20 25  CK, "recovered %
1cd80 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73 22  d pages from %s"
1cd90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cda0 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50 61    nPlayback, pPa
1cdb0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
1cdc0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
1cdd0 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
1cde0 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
1cdf0 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
1ce00 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
1ce10 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
1ce20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
1ce30 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
1ce40 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
1ce50 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
1ce60 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
1ce70 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
1ce80 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
1ce90 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
1cea0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
1ceb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1cec0 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74  ** Read the cont
1ced0 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  ent for page pPg
1cee0 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61   out of the data
1cef0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e  base file and in
1cf00 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74  to .** pPg->pDat
1cf10 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  a. A shared lock
1cf20 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
1cf30 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   be held on the 
1cf40 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
1cf50 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
1cf60 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
1cf70 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31  .**.** If page 1
1cf80 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74   is read, then t
1cf90 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
1cfa0 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
1cfb0 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20  s set to.** the 
1cfc0 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
1cfd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cfe0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  e..**.** If an I
1cff0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
1d000 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
1d010 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  r is returned to
1d020 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20   the caller..** 
1d030 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1d040 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1d050 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d060 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72  readDbPage(PgHdr
1d070 20 2a 70 50 67 2c 20 75 33 32 20 69 46 72 61 6d   *pPg, u32 iFram
1d080 65 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  e){.  Pager *pPa
1d090 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1d0a0 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65  r; /* Pager obje
1d0b0 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
1d0c0 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20  th page pPg */. 
1d0d0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
1d0e0 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a  ->pgno;       /*
1d0f0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
1d100 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  read */.  int rc
1d110 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1d120 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1d130 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70   code */.  int p
1d140 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  gsz = pPager->pa
1d150 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65  geSize; /* Numbe
1d160 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
1d170 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
1d180 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
1d190 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
1d1a0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
1d1b0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1d1c0 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 23 69 66 6e  er->fd) );..#ifn
1d1d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d1e0 57 41 4c 0a 20 20 69 66 28 20 69 46 72 61 6d 65  WAL.  if( iFrame
1d1f0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74   ){.    /* Try t
1d200 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20  o pull the page 
1d210 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61  from the write-a
1d220 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20  head log. */.   
1d230 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1d240 52 65 61 64 46 72 61 6d 65 28 70 50 61 67 65 72  ReadFrame(pPager
1d250 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c 20  ->pWal, iFrame, 
1d260 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61  pgsz, pPg->pData
1d270 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
1d280 66 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 69 4f  f.  {.    i64 iO
1d290 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
1d2a0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
1d2b0 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
1d2c0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1d2d0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e  Pager->fd, pPg->
1d2e0 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66  pData, pgsz, iOf
1d2f0 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72  fset);.    if( r
1d300 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1d310 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1d320 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d330 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
1d340 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
1d350 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1d360 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65      /* If the re
1d370 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66  ad is unsuccessf
1d380 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69  ul, set the dbFi
1d390 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65  leVers[] to some
1d3a0 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  thing.      ** t
1d3b0 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hat will never b
1d3c0 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76  e a valid file v
1d3d0 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56  ersion.  dbFileV
1d3e0 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a  ers[] is a copy.
1d3f0 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65        ** of byte
1d400 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  s 24..39 of the 
1d410 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73  database.  Bytes
1d420 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61   28..31 should a
1d430 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a  lways be.      *
1d440 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69  * zero or the si
1d450 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1d460 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65  se in page. Byte
1d470 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e  s 32..35 and 35.
1d480 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f  .39.      ** sho
1d490 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62  uld be page numb
1d4a0 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65  ers which are ne
1d4b0 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20  ver 0xffffffff. 
1d4c0 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20   So filling.    
1d4d0 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46    ** pPager->dbF
1d4e0 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61  ileVers[] with a
1d4f0 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68  ll 0xff bytes sh
1d500 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20  ould suffice..  
1d510 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1d520 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64  For an encrypted
1d530 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73   database, the s
1d540 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65  ituation is more
1d550 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73   complex:  bytes
1d560 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39  .      ** 24..39
1d570 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d580 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65   are white noise
1d590 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61  .  But the proba
1d5a0 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20  bility of.      
1d5b0 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67  ** white noising
1d5c0 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74   equaling 16 byt
1d5d0 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61  es of 0xff is va
1d5e0 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
1d5f0 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73  so.      ** we s
1d600 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f  hould still be o
1d610 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
1d620 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
1d630 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66  >dbFileVers, 0xf
1d640 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  f, sizeof(pPager
1d650 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1d660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d670 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20   u8 *dbFileVers 
1d680 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44  = &((u8*)pPg->pD
1d690 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20  ata)[24];.      
1d6a0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1d6b0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
1d6c0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70  leVers, sizeof(p
1d6d0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d6e0 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s));.    }.  }. 
1d6f0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
1d700 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  pPg->pData, pgno
1d710 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45  , 3, rc = SQLITE
1d720 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45  _NOMEM);..  PAGE
1d730 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1d740 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
1d750 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
1d760 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
1d770 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
1d780 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1d790 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41  er, pgno));.  PA
1d7a0 47 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48  GERTRACE(("FETCH
1d7b0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
1d7c0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
1d7d0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1d7e0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
1d7f0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1d800 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72  pPg)));..  retur
1d810 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
1d820 70 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20  pdate the value 
1d830 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  of the change-co
1d840 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73  unter at offsets
1d850 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a   24 and 92 in.**
1d860 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
1d870 74 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69  the sqlite versi
1d880 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66  on number at off
1d890 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68  set 96..**.** Th
1d8a0 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69  is is an uncondi
1d8b0 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20  tional update.  
1d8c0 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67  See also the pag
1d8d0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1d8e0 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69  unter().** routi
1d8f0 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70  ne which only up
1d900 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
1d910 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20  -counter if the 
1d920 75 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c  update is actual
1d930 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73  ly.** needed, as
1d940 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
1d950 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  he pPager->chang
1d960 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65  eCountDone state
1d970 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74   variable..*/.st
1d980 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
1d990 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
1d9a0 74 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ter(PgHdr *pPg){
1d9b0 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
1d9c0 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63  unter;..  /* Inc
1d9d0 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
1d9e0 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
1d9f0 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
1da00 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68  byte 24. */.  ch
1da10 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
1da20 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
1da30 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d  u8*)pPg->pPager-
1da40 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a  >dbFileVers)+1;.
1da50 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1da60 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1da70 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  24, change_count
1da80 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20  er);..  /* Also 
1da90 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65  store the SQLite
1daa0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
1dab0 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20  in bytes 96..99 
1dac0 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65  and in.  ** byte
1dad0 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74  s 92..95 store t
1dae0 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
1daf0 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  r for which the 
1db00 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20  version number. 
1db10 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f   ** is valid. */
1db20 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1db30 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1db40 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +92, change_coun
1db50 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74  ter);.  put32bit
1db60 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1db70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45  Data)+96, SQLITE
1db80 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29  _VERSION_NUMBER)
1db90 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1dba0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
1dbb0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1dbc0 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
1dbd0 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74   for each page t
1dbe0 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
1dbf0 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e  been .** written
1dc00 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69   into the log fi
1dc10 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72  le when a WAL tr
1dc20 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1dc30 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72  led back..** Par
1dc40 61 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68  ameter iPg is th
1dc50 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1dc60 20 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20   said page. The 
1dc70 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a  pCtx argument .*
1dc80 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  * is actually a 
1dc90 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
1dca0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a  ager structure..
1dcb0 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50  **.** If page iP
1dcc0 67 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  g is present in 
1dcd0 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68  the cache, and h
1dce0 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
1dcf0 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a  g references,.**
1dd00 20 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64   it is discarded
1dd10 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
1dd20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72  there are one or
1dd30 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e   more outstandin
1dd40 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c  g.** references,
1dd50 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1dd60 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72  t is reloaded fr
1dd70 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
1dd80 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d   If the.** attem
1dd90 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e  pt to reload con
1dda0 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61  tent from the da
1ddb0 74 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72  tabase is requir
1ddc0 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a  ed and fails, .*
1ddd0 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  * return an SQLi
1dde0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  te error code. O
1ddf0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1de00 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
1de10 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c  nt pagerUndoCall
1de20 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c  back(void *pCtx,
1de30 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e   Pgno iPg){.  in
1de40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1de50 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1de60 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74  r = (Pager *)pCt
1de70 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  x;.  PgHdr *pPg;
1de80 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
1de90 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1dea0 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74  );.  pPg = sqlit
1deb0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
1dec0 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66  ager, iPg);.  if
1ded0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28  ( pPg ){.    if(
1dee0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
1def0 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d  geRefcount(pPg)=
1df00 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
1df10 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
1df20 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
1df30 20 20 20 20 20 75 33 32 20 69 46 72 61 6d 65 20       u32 iFrame 
1df40 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
1df50 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72  sqlite3WalFindFr
1df60 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
1df70 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46  , pPg->pgno, &iF
1df80 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  rame);.      if(
1df90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1dfa0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
1dfb0 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69  eadDbPage(pPg, i
1dfc0 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Frame);.      }.
1dfd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1dfe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dff0 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
1e000 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20  iter(pPg);.     
1e010 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1e020 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
1e030 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  l(pPg);.    }.  
1e040 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79  }..  /* Normally
1e050 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  , if a transacti
1e060 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
1e070 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72  k, any backup pr
1e080 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a  ocesses are.  **
1e090 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61   updated as data
1e0a0 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f   is copied out o
1e0b0 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
1e0c0 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20  ournal and into 
1e0d0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
1e0e0 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67  e. This is not g
1e0f0 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c  enerally possibl
1e100 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74  e with a WAL dat
1e110 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72  abase, as.  ** r
1e120 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73  ollback involves
1e130 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69   simply truncati
1e140 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  ng the log file.
1e150 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f   Therefore, if o
1e160 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20  ne.  ** or more 
1e170 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65  frames have alre
1e180 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1e190 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64   to the log (and
1e1a0 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a   therefore .  **
1e1b0 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74   also copied int
1e1c0 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74  o the backup dat
1e1d0 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20  abases) as part 
1e1e0 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
1e1f0 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61  ion,.  ** the ba
1e200 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65  ckups must be re
1e210 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  started..  */.  
1e220 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
1e230 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
1e240 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ckup);..  return
1e250 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1e260 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1e270 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63  alled to rollbac
1e280 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
1e290 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  on a WAL databas
1e2a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e2b0 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
1e2c0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1e2d0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
1e300 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  de */.  PgHdr *p
1e310 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1e320 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
1e330 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74  of dirty pages t
1e340 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f  o revert */..  /
1e350 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20  * For all pages 
1e360 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
1e370 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
1e380 64 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c  dirty or have al
1e390 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20  ready.  ** been 
1e3a0 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74  written (but not
1e3b0 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74   committed) to t
1e3c0 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20  he log file, do 
1e3d0 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a  one of the .  **
1e3e0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a   following:.  **
1e3f0 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72  .  **   + Discar
1e400 64 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67  d the cached pag
1e410 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d  e (if refcount==
1e420 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20  0), or.  **   + 
1e430 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  Reload page cont
1e440 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1e450 61 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75  abase (if refcou
1e460 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50  nt>0)..  */.  pP
1e470 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1e480 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1e490 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
1e4a0 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d  3WalUndo(pPager-
1e4b0 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f  >pWal, pagerUndo
1e4c0 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
1e4d0 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69  *)pPager);.  pLi
1e4e0 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
1e4f0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
1e500 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1e510 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20  while( pList && 
1e520 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e530 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78  .    PgHdr *pNex
1e540 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
1e550 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  y;.    rc = page
1e560 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76  rUndoCallback((v
1e570 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c  oid *)pPager, pL
1e580 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
1e590 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pList = pNext;. 
1e5a0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1e5b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1e5c0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61  unction is a wra
1e5d0 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
1e5e0 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20  te3WalFrames(). 
1e5f0 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69  As well as loggi
1e600 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ng.** the conten
1e610 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f  ts of the list o
1e620 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62  f pages headed b
1e630 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74  y pList (connect
1e640 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a  ed by pDirty),.*
1e650 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1e660 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74  notifies any act
1e670 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ive backup proce
1e680 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61  sses that the pa
1e690 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e  ges have.** chan
1e6a0 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ged. .**.** The 
1e6b0 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61  list of pages pa
1e6c0 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72  ssed into this r
1e6d0 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73  outine is always
1e6e0 20 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20   sorted by page 
1e6f0 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65  number..** Hence
1e700 2c 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65  , if page 1 appe
1e710 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  ars anywhere on 
1e720 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c  the list, it wil
1e730 6c 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70  l be the first p
1e740 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  age..*/ .static 
1e750 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d  int pagerWalFram
1e760 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  es(.  Pager *pPa
1e770 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
1e780 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1e790 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72  bject */.  PgHdr
1e7a0 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
1e7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1e7c0 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20  st of frames to 
1e7d0 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54  log */.  Pgno nT
1e7e0 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
1e7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1e800 62 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20  base size after 
1e810 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  this commit */. 
1e820 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e840 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
1e850 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a   is a commit */.
1e860 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1e890 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69  ode */.  int nLi
1e8a0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1e8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e8c0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70  er of pages in p
1e8d0 4c 69 73 74 20 2a 2f 0a 23 69 66 20 64 65 66 69  List */.#if defi
1e8e0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1e8f0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1e900 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 29  ITE_CHECK_PAGES)
1e910 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20  .  PgHdr *p;    
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e930 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1e940 67 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a  g over pages */.
1e950 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1e960 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29  ( pPager->pWal )
1e970 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
1e980 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  t );.#ifdef SQLI
1e990 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65  TE_DEBUG.  /* Ve
1e9a0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61  rify that the pa
1e9b0 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63  ge list is in ac
1e9c0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f  cending order */
1e9d0 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1e9e0 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20  p && p->pDirty; 
1e9f0 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1ea00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e    assert( p->pgn
1ea10 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70  o < p->pDirty->p
1ea20 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  gno );.  }.#endi
1ea30 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  f..  assert( pLi
1ea40 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c  st->pDirty==0 ||
1ea50 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69   isCommit );.  i
1ea60 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20  f( isCommit ){. 
1ea70 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74     /* If a WAL t
1ea80 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
1ea90 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  ing committed, t
1eaa0 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
1eab0 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20   in writing.    
1eac0 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74  ** any pages wit
1ead0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
1eae0 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75  reater than nTru
1eaf0 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57  ncate into the W
1eb00 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  AL file..    ** 
1eb10 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  They will never 
1eb20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63  be read by any c
1eb30 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65  lient. So remove
1eb40 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70   them from the p
1eb50 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73  Dirty.    ** lis
1eb60 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50  t here. */.    P
1eb70 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 50 67 48  gHdr *p;.    PgH
1eb80 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70  dr **ppNext = &p
1eb90 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20  List;.    nList 
1eba0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  = 0;.    for(p=p
1ebb0 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d  List; (*ppNext =
1ebc0 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69   p)!=0; p=p->pDi
1ebd0 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rty){.      if( 
1ebe0 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61  p->pgno<=nTrunca
1ebf0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70  te ){.        pp
1ec00 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74  Next = &p->pDirt
1ec10 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74  y;.        nList
1ec20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1ec30 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  }.    assert( pL
1ec40 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
1ec50 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20      nList = 1;. 
1ec60 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74   }.  pPager->aSt
1ec70 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52  at[PAGER_STAT_WR
1ec80 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a  ITE] += nList;..
1ec90 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
1eca0 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69  o==1 ) pager_wri
1ecb0 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1ecc0 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20  (pList);.  rc = 
1ecd0 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
1ece0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a  (pPager->pWal, .
1ecf0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1ed00 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e  geSize, pList, n
1ed10 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d  Truncate, isComm
1ed20 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  it, pPager->walS
1ed30 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20  yncFlags.  );.  
1ed40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ed50 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61  K && pPager->pBa
1ed60 63 6b 75 70 20 29 7b 0a 20 20 20 20 50 67 48 64  ckup ){.    PgHd
1ed70 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  r *p;.    for(p=
1ed80 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
1ed90 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71  Dirty){.      sq
1eda0 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
1edb0 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
1edc0 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20  p, p->pgno, (u8 
1edd0 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  *)p->pData);.   
1ede0 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
1edf0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1ee00 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  S.  pList = sqli
1ee10 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1ee20 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1ee30 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69  he);.  for(p=pLi
1ee40 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
1ee50 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73  ty){.    pager_s
1ee60 65 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a  et_pagehash(p);.
1ee70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
1ee80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ee90 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74  * Begin a read t
1eea0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1eeb0 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  e WAL..**.** Thi
1eec0 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  s routine used t
1eed0 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67  o be called "pag
1eee0 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29  erOpenSnapshot()
1eef0 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73  " because it ess
1ef00 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  entially.** make
1ef10 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20  s a snapshot of 
1ef20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
1ef30 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e  the current poin
1ef40 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72  t in time and pr
1ef50 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20  eserves.** that 
1ef60 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65  snapshot for use
1ef70 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69   by the reader i
1ef80 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75  n spite of concu
1ef90 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20  rrently changes 
1efa0 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74  by.** other writ
1efb0 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e  ers or checkpoin
1efc0 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
1efd0 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65  int pagerBeginRe
1efe0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  adTransaction(Pa
1eff0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1f000 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1f010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f020 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1f030 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20  /.  int changed 
1f040 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1f050 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
1f060 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73  ache must be res
1f070 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
1f080 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1f090 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
1f0a0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1f0b0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  ==PAGER_OPEN || 
1f0c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1f0d0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
1f0e0 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c  .  /* sqlite3Wal
1f0f0 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
1f100 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  on() was not cal
1f110 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72 65 76  led for the prev
1f120 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ious.  ** transa
1f130 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67  ction in locking
1f140 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e  _mode=EXCLUSIVE.
1f150 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77    So call it now
1f160 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72  .  If we.  ** ar
1f170 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e in locking_mod
1f180 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64  e=NORMAL and End
1f190 52 65 61 64 28 29 20 77 61 73 20 70 72 65 76 69  Read() was previ
1f1a0 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20  ously called,.  
1f1b0 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  ** the duplicate
1f1c0 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73   call is harmles
1f1d0 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
1f1e0 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
1f1f0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
1f200 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  Wal);..  rc = sq
1f210 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61  lite3WalBeginRea
1f220 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
1f230 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e  ger->pWal, &chan
1f240 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ged);.  if( rc!=
1f250 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61  SQLITE_OK || cha
1f260 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65  nged ){.    page
1f270 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1f280 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43  .    if( USEFETC
1f290 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69  H(pPager) ) sqli
1f2a0 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
1f2b0 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
1f2c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1f2d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1f2e0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f2f0 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
1f300 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74  t of the transit
1f310 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f  ion from PAGER_O
1f320 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f  PEN.** to PAGER_
1f330 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20  READER state to 
1f340 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
1f350 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1f360 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61  se file.** in pa
1f370 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68  ges (assuming th
1f380 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72  e page size curr
1f390 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
1f3a0 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e  Pager.pageSize).
1f3b0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
1f3c0 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
1f3d0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1f3e0 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
1f3f0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1f400 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f   in pages is sto
1f410 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20  red in *pnPage. 
1f420 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
1f430 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70  ror code (perhap
1f440 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52  s.** SQLITE_IOER
1f450 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75  R_FSTAT) is retu
1f460 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65  rned and *pnPage
1f470 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
1f480 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ied..*/.static i
1f490 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  nt pagerPagecoun
1f4a0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
1f4b0 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a   Pgno *pnPage){.
1f4c0 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
1f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4e0 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
1f4f0 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65  turn via *pnPage
1f500 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20   */..  /* Query 
1f510 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
1f520 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  em for the datab
1f530 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61  ase size. The Wa
1f540 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66  lDbsize().  ** f
1f550 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1f560 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20  zero if the WAL 
1f570 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65  is not open (i.e
1f580 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29  . Pager.pWal==0)
1f590 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65  , or.  ** if the
1f5a0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1f5b0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
1f5c0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1f5d0 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ze is not.  ** a
1f5e0 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68  vailable from th
1f5f0 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1f600 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   if the log file
1f610 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a   is empty or.  *
1f620 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61  * contains no va
1f630 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72  lid committed tr
1f640 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f  ansactions..  */
1f650 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f660 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1f670 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
1f680 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
1f690 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
1f6a0 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74  .  nPage = sqlit
1f6b0 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67  e3WalDbsize(pPag
1f6c0 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a  er->pWal);..  /*
1f6d0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1f6e0 20 73 69 7a 65 20 77 61 73 20 6e 6f 74 20 61 76   size was not av
1f6f0 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
1f700 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c   WAL sub-system,
1f710 0a 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20  .  ** determine 
1f720 69 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  it based on the 
1f730 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1f740 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
1f750 65 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74  e size.  ** of t
1f760 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f770 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
1f780 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
1f790 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20  he page-size,.  
1f7a0 2a 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f  ** round down to
1f7b0 20 74 68 65 20 6e 65 61 72 65 73 74 20 70 61 67   the nearest pag
1f7c0 65 2e 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66  e. Except, any f
1f7d0 69 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ile larger than 
1f7e0 30 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  0.  ** bytes in 
1f7f0 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72  size is consider
1f800 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74  ed to contain at
1f810 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e   least one page.
1f820 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
1f830 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20  e==0 ){.    i64 
1f840 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
1f850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1f860 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20  e of db file in 
1f870 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73  bytes */.    ass
1f880 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1f890 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
1f8a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1f8b0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
1f8c0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1f8d0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1f8e0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1f8f0 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20  ager->fd, &n);. 
1f900 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f910 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f930 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
1f940 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e  Page = (Pgno)((n
1f950 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
1f960 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70  e-1) / pPager->p
1f970 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
1f980 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
1f990 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  nt number of pag
1f9a0 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  es in the file i
1f9b0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
1f9c0 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  he.  ** configur
1f9d0 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
1f9e0 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
1f9f0 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
1fa00 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
1fa10 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
1fa20 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
1fa30 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
1fa40 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
1fa50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
1fa60 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
1fa70 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
1fa80 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
1fa90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
1faa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1fab0 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  AL./*.** Check i
1fac0 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
1fad0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
1fae0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1faf0 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67  e opened by pPag
1fb00 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20  er.** exists if 
1fb10 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1fb20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72  not empy, or ver
1fb30 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77  ify that the *-w
1fb40 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
1fb50 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65  not exist (by de
1fb60 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68  leting it) if th
1fb70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fb80 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
1fb90 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1fba0 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64  is not empty and
1fbb0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1fbc0 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65  exists, open the
1fbd0 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c   pager.** in WAL
1fbe0 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64   mode.  If the d
1fbf0 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
1fc00 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20   or if no *-wal 
1fc10 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a  file exists and.
1fc20 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** if no error o
1fc30 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65  ccurs, make sure
1fc40 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
1fc50 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f  de is not set to
1fc60 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  .** PAGER_JOURNA
1fc70 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a  LMODE_WAL..**.**
1fc80 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1fc90 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  K or an error co
1fca0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  de..**.** The ca
1fcb0 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ller must hold a
1fcc0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
1fcd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fce0 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a  e to call this.*
1fcf0 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61  * function. Beca
1fd00 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  use an EXCLUSIVE
1fd10 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20   lock on the db 
1fd20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
1fd30 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61   to delete .** a
1fd40 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65   WAL on a none-e
1fd50 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74  mpty database, t
1fd60 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72  his ensures ther
1fd70 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e  e is no race con
1fd80 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65  dition .** betwe
1fd90 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29  en the xAccess()
1fda0 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44   below and an xD
1fdb0 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78  elete() being ex
1fdc0 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a  ecuted by some .
1fdd0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
1fde0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1fdf0 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  nt pagerOpenWalI
1fe00 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a  fPresent(Pager *
1fe10 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1fe20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1fe30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1fe40 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1fe50 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
1fe60 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
1fe70 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
1fe80 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
1fe90 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
1fea0 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20  nt isWal;       
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fec0 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65  True if WAL file
1fed0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50   exists */.    P
1fee0 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff00 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  Size of the data
1ff10 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
1ff20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
1ff30 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
1ff40 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1ff50 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1ff60 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
1ff70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1ff80 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
1ff90 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
1ffa0 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20  er->zWal, 0);.  
1ffb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ffc0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
1ffd0 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c  NOENT ) rc = SQL
1ffe0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73  ITE_OK;.      is
1fff0 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Wal = 0;.    }el
20000 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
20010 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
20020 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
20030 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
20040 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  zWal, SQLITE_ACC
20050 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57  ESS_EXISTS, &isW
20060 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  al.      );.    
20070 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
20080 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20090 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20   if( isWal ){.  
200a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
200b0 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
200c0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
200d0 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
200e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
200f0 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
20100 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
20110 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
20120 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
20130 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20140 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
20150 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20160 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
20170 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
20180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20190 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
201a0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
201b0 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
201c0 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
201d0 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
201e0 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
201f0 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
20200 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
20210 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
20220 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
20230 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
20240 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
20250 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
20260 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
20270 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
20280 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
20290 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
202a0 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
202b0 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
202c0 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
202d0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
202e0 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
202f0 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
20300 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
20310 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
20320 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
20330 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
20340 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
20350 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
20360 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
20370 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
20380 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
20390 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
203a0 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
203b0 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
203c0 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
203d0 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
203e0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
203f0 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
20400 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20410 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
20420 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
20430 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
20440 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
20450 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
20460 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
20470 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
20480 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
20490 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
204a0 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
204b0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
204c0 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
204d0 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
204e0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
204f0 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
20500 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20510 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
20520 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
20530 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
20540 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
20550 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
20560 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
20570 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
20580 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
20590 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
205a0 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
205b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
205c0 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
205d0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
205e0 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
205f0 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
20600 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
20610 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
20620 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
20630 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
20640 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
20650 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
20660 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
20670 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
20680 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
20690 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
206a0 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
206b0 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
206c0 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
206d0 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
206e0 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
206f0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
20700 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
20710 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
20720 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
20730 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
20740 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
20750 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
20760 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
20770 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
20780 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
20790 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
207a0 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
207b0 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
207c0 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
207d0 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
207e0 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
207f0 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
20800 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
20810 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
20820 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
20830 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
20840 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
20850 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
20860 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
20870 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
20880 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
20890 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
208a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
208b0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
208c0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
208d0 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
208e0 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
208f0 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
20900 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
20910 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
20920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
20930 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
20940 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
20950 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
20960 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20970 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
20980 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
20990 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
209a0 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
209b0 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
209c0 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
209d0 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
209e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
209f0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
20a00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20a10 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
20a20 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
20a30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
20a40 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75  te a bitvec to u
20a50 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  se to store the 
20a60 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c  set of pages rol
20a70 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66  led back */.  if
20a80 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
20a90 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69      pDone = sqli
20aa0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
20ab0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
20ac0 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f  g);.    if( !pDo
20ad0 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ne ){.      retu
20ae0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
20af0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
20b00 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Set the databas
20b10 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  e size back to t
20b20 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20  he value it was 
20b30 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70  before the savep
20b40 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67  oint .  ** being
20b50 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70   reverted was op
20b60 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  ened..  */.  pPa
20b70 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53  ger->dbSize = pS
20b80 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65  avepoint ? pSave
20b90 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70  point->nOrig : p
20ba0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
20bb0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  e;.  pPager->cha
20bc0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
20bd0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
20be0 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f  ..  if( !pSavepo
20bf0 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57  int && pagerUseW
20c00 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
20c10 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f    return pagerRo
20c20 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72  llbackWal(pPager
20c30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65  );.  }..  /* Use
20c40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20c50 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
20c60 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
20c70 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
20c80 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
20c90 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
20ca0 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
20cb0 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
20cc0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20cd0 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
20ce0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20cf0 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
20d00 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
20d10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20d20 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
20d30 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
20d40 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
20d50 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65  urnalOff;.  asse
20d60 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
20d70 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a  pPager)==0 || sz
20d80 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  J==0 );..  /* Be
20d90 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62  gin by rolling b
20da0 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  ack records from
20db0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20dc0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
20dd0 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
20de0 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
20df0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
20e00 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
20e10 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20  der..  ** There 
20e20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73  might be records
20e30 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
20e40 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61  rnal that have a
20e50 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
20e60 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  * greater than t
20e70 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  he current datab
20e80 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72  ase size (pPager
20e90 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68  ->dbSize) but th
20ea0 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ose.  ** will be
20eb0 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74   skipped automat
20ec0 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61  ically.  Pages a
20ed0 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e  re added to pDon
20ee0 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61  e as they.  ** a
20ef0 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  re played back..
20f00 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
20f10 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55  point && !pagerU
20f20 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
20f30 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
20f40 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
20f50 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
20f60 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
20f70 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
20f80 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
20f90 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
20fa0 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
20fb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20fc0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20fd0 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
20fe0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
20ff0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
21000 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
21010 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
21020 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
21030 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
21040 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
21050 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
21060 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21070 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
21080 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
21090 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
210a0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
210b0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
210c0 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
210d0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
210e0 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
210f0 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
21100 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
21110 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
21120 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
21130 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
21140 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
21150 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
21160 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
21170 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
21180 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
21190 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
211a0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
211b0 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
211c0 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
211d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
211e0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
211f0 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
21200 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
21210 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
21220 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
21230 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
21240 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
21250 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
21260 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
21270 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
21280 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
21290 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
212a0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
212b0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
212c0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
212d0 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
212e0 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
212f0 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
21300 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
21310 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
21320 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
21330 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
21340 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
21350 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
21360 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
21370 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
21380 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
21390 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
213a0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
213b0 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
213c0 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
213d0 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
213e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
213f0 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
21400 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
21410 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
21420 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
21430 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
21440 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
21450 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
21460 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
21470 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
21480 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
21490 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
214a0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
214b0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
214c0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61  _DONE );.  }.  a
214d0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
214e0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
214f0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20  journalOff>=szJ 
21500 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79  );..  /* Finally
21510 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  ,  rollback page
21520 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  s from the sub-j
21530 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68  ournal.  Page th
21540 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65  at were.  ** pre
21550 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62  viously rolled b
21560 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ack out of the m
21570 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  ain journal (and
21580 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44   are hence in pD
21590 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  one).  ** will b
215a0 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d  e skipped.  Out-
215b0 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
215c0 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e  re also skipped.
215d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
215e0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33  epoint ){.    u3
215f0 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
21600 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21610 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73   */.    i64 offs
21620 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70  et = (i64)pSavep
21630 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34  oint->iSubRec*(4
21640 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
21650 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67  e);..    if( pag
21660 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
21670 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
21680 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69  qlite3WalSavepoi
21690 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  ntUndo(pPager->p
216a0 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d  Wal, pSavepoint-
216b0 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20  >aWalData);.    
216c0 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61  }.    for(ii=pSa
216d0 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
216e0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
216f0 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  && ii<pPager->nS
21700 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  ubRec; ii++){.  
21710 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
21720 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70  et==(i64)ii*(4+p
21730 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
21740 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
21750 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
21760 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
21770 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
21780 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
21790 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
217a0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
217b0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
217c0 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
217d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
217e0 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
217f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
21800 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
21810 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
21820 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
21830 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
21840 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
21850 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
21860 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21870 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
21880 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
21890 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
218a0 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
218b0 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
218c0 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
218d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
218e0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
218f0 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e  AP_SIZE based on
21900 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
21910 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f  ue of szMmap..*/
21920 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
21930 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61  erFixMaplimit(Pa
21940 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
21950 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
21960 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74  P_SIZE>0.  sqlit
21970 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50  e3_file *fd = pP
21980 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20  ager->fd;.  if( 
21990 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64  isOpen(fd) && fd
219a0 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
219b0 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73  sion>=3 ){.    s
219c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
219d0 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72  .    sz = pPager
219e0 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50  ->szMmap;.    pP
219f0 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20  ager->bUseFetch 
21a00 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 71  = (sz>0);.    sq
21a10 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
21a20 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
21a30 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
21a40 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b  MMAP_SIZE, &sz);
21a50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
21a60 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
21a70 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
21a80 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  any memory mappi
21a90 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64  ng made of the d
21aa0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
21ab0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21ac0 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50  erSetMmapLimit(P
21ad0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71  ager *pPager, sq
21ae0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
21af0 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ap){.  pPager->s
21b00 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
21b10 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
21b20 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  it(pPager);.}../
21b30 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63  *.** Free as muc
21b40 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
21b50 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ible from the pa
21b60 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ger..*/.void sql
21b70 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
21b80 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21b90 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
21ba0 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50  hrink(pPager->pP
21bb0 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
21bc0 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73   Adjust settings
21bd0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74 6f   of the pager to
21be0 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
21bf0 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20   in the pgFlags 
21c00 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
21c10 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20   The "level" in 
21c20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
21c30 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
21c40 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73 74   sets the robust
21c50 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ness.** of the d
21c60 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
21c70 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
21c80 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69  hes or power fai
21c90 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e  lures by.** chan
21ca0 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
21cb0 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
21cc0 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
21cd0 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20  rnals..** There 
21ce0 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
21cf0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
21d00 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
21d10 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
21d20 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
21d30 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
21d40 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
21d50 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
21d60 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
21d70 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
21d80 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
21d90 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
21da0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
21db0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
21dc0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
21dd0 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
21de0 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
21df0 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
21e00 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
21e10 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
21e20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
21e30 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
21e40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21e50 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
21e60 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
21e70 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
21e80 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
21e90 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
21ea0 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
21eb0 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
21ec0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
21ee0 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
21ef0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
21f00 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
21f10 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
21f20 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
21f30 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
21f40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
21f50 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
21f60 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
21f70 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
21f80 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
21f90 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
21fa0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
21fb0 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
21fc0 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
21fd0 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
21fe0 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
21ff0 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
22000 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
22010 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
22020 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
22030 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
22040 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
22050 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
22060 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
22070 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
22080 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
22090 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
220a0 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
220b0 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
220c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
220d0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
220e0 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
220f0 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63  is for a rollbac
22100 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20  k-journal mode. 
22110 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f   For WAL mode, O
22120 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20  FF continues.** 
22130 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20  to mean that no 
22140 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72  syncs ever occur
22150 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20  .  NORMAL means 
22160 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20  that the WAL is 
22170 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20  synced.** prior 
22180 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
22190 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74  checkpoint and t
221a0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
221b0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a   file is synced.
221c0 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
221d0 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63  sion of the chec
221e0 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e  kpoint if the en
221f0 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
22200 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77  the WAL.** was w
22210 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
22220 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
22230 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72  But no sync oper
22240 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72  ations occur for
22250 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  .** an ordinary 
22260 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c  commit in NORMAL
22270 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20   mode with WAL. 
22280 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   FULL means that
22290 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65   the WAL.** file
222a0 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   is synced follo
222b0 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74  wing each commit
222c0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61   operation, in a
222d0 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a  ddition to the.*
222e0 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74  * syncs associat
222f0 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a  ed with NORMAL..
22300 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e  **.** Do not con
22310 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73  fuse synchronous
22320 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54  =FULL with SQLIT
22330 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68  E_SYNC_FULL.  Th
22340 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43  e.** SQLITE_SYNC
22350 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e  _FULL macro mean
22360 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63  s to use the Mac
22370 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66  OSX-style full-f
22380 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63  sync.** using fc
22390 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29  ntl(F_FULLFSYNC)
223a0 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  .  SQLITE_SYNC_N
223b0 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64  ORMAL means to d
223c0 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  o an.** ordinary
223d0 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20   fsync() call.  
223e0 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66  There is no diff
223f0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53  erence between S
22400 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
22410 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59  ** and SQLITE_SY
22420 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61  NC_NORMAL on pla
22430 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61  tforms other tha
22440 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74  n MacOSX.  But t
22450 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75  he.** synchronou
22460 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79  s=FULL versus sy
22470 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
22480 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69   setting determi
22490 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  nes when.** the 
224a0 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20  xSync primitive 
224b0 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73  is called and is
224c0 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c   relevant to all
224d0 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a   platforms..**.*
224e0 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
224f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22500 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
22510 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
22520 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
22530 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
22540 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
22550 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
22560 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
22570 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
22580 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
22590 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73  e pager to set s
225a0 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20  afety level for 
225b0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
225c0 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61  Flags      /* Va
225d0 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29  rious flags */.)
225e0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76  {.  unsigned lev
225f0 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50  el = pgFlags & P
22600 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
22610 5f 4d 41 53 4b 3b 0a 20 20 61 73 73 65 72 74 28  _MASK;.  assert(
22620 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76   level>=1 && lev
22630 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67 65  el<=3 );.  pPage
22640 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65  r->noSync =  (le
22650 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
22660 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
22670 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
22680 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33  Sync = (level==3
22690 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
226a0 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69  pFile) ?1:0;.  i
226b0 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
226c0 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
226d0 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  >syncFlags = 0;.
226e0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
226f0 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  SyncFlags = 0;. 
22700 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61   }else if( pgFla
22710 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46  gs & PAGER_FULLF
22720 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67  SYNC ){.    pPag
22730 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
22740 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22750 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
22760 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
22770 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
22780 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
22790 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54  ags & PAGER_CKPT
227a0 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20  _FULLFSYNC ){.  
227b0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
227c0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
227d0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
227e0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
227f0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22800 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  C_FULL;.  }else{
22810 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22820 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22830 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
22840 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
22850 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22860 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
22870 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  .  pPager->walSy
22880 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
22890 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69  ->syncFlags;.  i
228a0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
228b0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
228c0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
228d0 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e  |= WAL_SYNC_TRAN
228e0 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20  SACTIONS;.  }.  
228f0 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
22900 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29  GER_CACHESPILL )
22910 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  {.    pPager->do
22920 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
22930 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65  LLFLAG_OFF;.  }e
22940 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
22950 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
22960 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
22970 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
22980 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
22990 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
229a0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
229b0 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
229c0 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
229d0 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
229e0 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
229f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
22a00 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
22a10 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
22a20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
22a30 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
22a40 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
22a50 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
22a60 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
22a70 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
22a80 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
22a90 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
22aa0 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
22ab0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
22ac0 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
22ad0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
22ae0 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
22af0 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
22b00 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
22b10 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
22b20 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
22b30 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
22b40 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
22b50 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
22b60 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
22b70 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
22b80 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
22b90 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
22ba0 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
22bb0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
22bc0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22bd0 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
22be0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
22bf0 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
22c00 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
22c10 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
22c20 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
22c30 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
22c40 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
22c50 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
22c60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
22c70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
22c80 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
22c90 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
22ca0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
22cb0 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
22cc0 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
22cd0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
22ce0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
22cf0 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
22d00 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22d10 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
22d20 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
22d30 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
22d40 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
22d50 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
22d60 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
22d70 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
22d80 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
22d90 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
22da0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
22db0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
22dc0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
22dd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
22de0 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
22df0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
22e00 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
22e10 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
22e20 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
22e30 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
22e40 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
22e50 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
22e60 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
22e70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22e80 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
22e90 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
22ea0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
22eb0 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
22ec0 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
22ed0 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
22ee0 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
22ef0 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
22f00 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
22f10 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
22f20 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
22f30 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
22f40 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
22f50 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
22f60 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
22f70 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
22f80 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
22f90 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
22fa0 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
22fb0 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
22fc0 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
22fd0 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
22fe0 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
22ff0 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
23000 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
23010 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
23020 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
23030 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
23060 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
23070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
230a0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
230b0 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
230c0 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
230d0 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
230e0 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
230f0 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
23100 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
23110 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
23120 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
23130 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
23140 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
23150 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
23160 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
23170 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
23180 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
23190 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
231a0 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
231b0 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
231c0 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
231d0 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
231e0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
231f0 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
23200 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
23210 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
23220 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
23230 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
23240 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
23250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
23260 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
23270 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
23280 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
23290 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
232a0 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
232b0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
232c0 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
232d0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
232e0 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
232f0 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
23300 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70  andler */.){.  p
23310 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
23320 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
23330 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
23340 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
23350 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
23360 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
23370 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
23380 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76    void **ap = (v
23390 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e  oid **)&pPager->
233a0 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
233b0 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28    assert( ((int(
233c0 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30  *)(void *))(ap[0
233d0 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65  ]))==xBusyHandle
233e0 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
233f0 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e   ap[1]==pBusyHan
23400 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73  dlerArg );.    s
23410 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
23420 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
23430 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
23440 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76  _BUSYHANDLER, (v
23450 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d  oid *)ap);.  }.}
23460 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
23470 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
23480 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
23490 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
234a0 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
234b0 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
234c0 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
234d0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
234e0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
234f0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
23500 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
23510 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
23520 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
23530 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
23540 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
23550 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
23560 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61   SQLITE_IOERR, a
23570 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78  n SQLITE_IOERR_x
23580 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53  xx sub-code or S
23590 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
235a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
235b0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
235c0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
235d0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
235e0 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
235f0 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
23600 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
23610 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
23620 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
23630 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
23640 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
23650 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
23660 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
23670 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
23680 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
23690 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
236a0 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
236b0 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
236c0 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
236d0 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
236e0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
236f0 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
23700 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
23710 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
23720 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
23730 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
23740 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
23750 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
23760 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
23770 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
23780 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
23790 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
237a0 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
237b0 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
237c0 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
237d0 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
237e0 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
237f0 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
23800 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
23810 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
23820 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
23830 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
23840 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
23850 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
23860 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
23870 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
23880 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
23890 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
238a0 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
238b0 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
238c0 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
238d0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
238e0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
238f0 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
23900 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
23910 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
23920 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
23930 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
23940 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
23950 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
23960 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
23970 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
23980 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
23990 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
239a0 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
239b0 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a  r *pPager, u32 *
239c0 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
239d0 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
239e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
239f0 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
23a00 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
23a10 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67   full assert_pag
23a20 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c  er_state() here,
23a30 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   as this.  ** fu
23a40 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
23a50 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
23a60 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65   PagerOpen(), be
23a70 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20  fore the state. 
23a80 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72   ** of the Pager
23a90 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72   object is inter
23aa0 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
23ab0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f  ..  **.  ** At o
23ac0 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75  ne point this fu
23ad0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
23ae0 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
23af0 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20  pager was in .  
23b00 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ** PAGER_ERROR s
23b10 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20  tate. But since 
23b20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
23b30 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
23b40 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  t.  ** there is 
23b50 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
23b60 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
23b70 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75  ference, this fu
23b80 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
23b90 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20   no-op for that 
23ba0 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  case anyhow..  *
23bb0 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a  /..  u32 pageSiz
23bc0 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
23bd0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
23be0 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
23bf0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
23c00 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
23c10 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
23c20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
23c30 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
23c40 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26  >dbSize==0).   &
23c50 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
23c60 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
23c70 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
23c80 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
23c90 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50  ageSize!=(u32)pP
23ca0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
23cb0 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
23cc0 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  New = NULL;     
23cd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
23ce0 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  emp space */.   
23cf0 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a   i64 nByte = 0;.
23d00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
23d10 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
23d20 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  EN && isOpen(pPa
23d30 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
23d40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23d50 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
23d60 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
23d70 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
23d80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23d90 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
23da0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
23db0 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
23dc0 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
23dd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
23de0 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  EM;.    }..    i
23df0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23e00 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
23e10 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
23e20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23e30 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
23e40 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
23e50 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
23e60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
23e70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23e80 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
23e90 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
23ea0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
23eb0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
23ec0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50  = pNew;.      pP
23ed0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28  ager->dbSize = (
23ee0 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67  Pgno)((nByte+pag
23ef0 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a  eSize-1)/pageSiz
23f00 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
23f10 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
23f20 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  eSize;.    }else
23f30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
23f40 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20  ageFree(pNew);. 
23f50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61     }.  }..  *pPa
23f60 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
23f70 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28  >pageSize;.  if(
23f80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23f90 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72  {.    if( nReser
23fa0 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20  ve<0 ) nReserve 
23fb0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  = pPager->nReser
23fc0 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
23fd0 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
23fe0 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a  Reserve<1000 );.
23ff0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
24000 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73  erve = (i16)nRes
24010 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
24020 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
24030 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d  );.    pagerFixM
24040 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
24050 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24060 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
24070 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
24080 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
24090 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
240a0 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
240b0 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
240c0 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
240d0 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
240e0 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
240f0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
24100 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
24110 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
24120 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
24130 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
24140 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
24150 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
24160 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
24170 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
24180 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
24190 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
241a0 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
241b0 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
241c0 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
241d0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
241e0 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
241f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
24200 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
24210 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
24220 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
24230 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
24240 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
24250 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
24260 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
24270 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
24280 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
24290 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
242a0 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
242b0 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
242c0 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
242d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
242e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
242f0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
24300 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
24310 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
24320 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
24330 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
24340 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
24350 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
24360 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
24370 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  {.  if( mxPage>0
24380 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
24390 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
243a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
243b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
243c0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20  AGER_OPEN );    
243d0 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79    /* Called only
243e0 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   by OP_MaxPgcnt 
243f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
24400 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61  ger->mxPgno>=pPa
24410 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20  ger->dbSize );  
24420 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65  /* OP_MaxPgcnt e
24430 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a  nforces this */.
24440 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
24450 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mxPgno;.}../*.*
24460 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
24470 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
24480 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
24490 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
244a0 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
244b0 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
244c0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
244d0 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
244e0 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
244f0 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
24500 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
24510 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
24520 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
24530 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
24540 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
24550 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
24560 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
24570 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
24580 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
24590 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
245a0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
245b0 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
245c0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
245d0 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
245e0 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
245f0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
24600 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
24610 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20  d){.  saved_cnt 
24620 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
24630 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71  or_pending;.  sq
24640 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
24650 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76  ending = -1;.}.v
24660 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  oid enable_simul
24670 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
24680 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
24690 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
246a0 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a   = saved_cnt;.}.
246b0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64  #else.# define d
246c0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
246d0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
246e0 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
246f0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
24700 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
24710 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
24720 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
24730 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
24740 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
24750 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
24760 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
24770 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
24780 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
24790 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28  transient file (
247a0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20  zFilename==""), 
247b0 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20  or.** opened on 
247c0 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e  a file less than
247d0 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   N bytes in size
247e0 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  , the output buf
247f0 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64  fer is.** zeroed
24800 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
24810 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74  eturned. The rat
24820 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20  ionale for this 
24830 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a  is that this .**
24840 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
24850 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  d to read databa
24860 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20  se headers, and 
24870 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20  a new transient 
24880 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64  or.** zero sized
24890 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20   database has a 
248a0 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73  header than cons
248b0 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
248c0 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   zeroes..**.** I
248d0 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61  f any IO error a
248e0 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45  part from SQLITE
248f0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
24900 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  D is encountered
24910 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63  ,.** the error c
24920 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
24930 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e  to the caller an
24940 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
24950 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20  f the.** output 
24960 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64  buffer undefined
24970 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24980 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
24990 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
249a0 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
249b0 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
249c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
249d0 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
249e0 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
249f0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
24a00 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
24a10 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
24a20 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
24a30 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
24a40 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d  led by btree imm
24a50 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63  ediately after c
24a60 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
24a70 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20   Pager object.  
24a80 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65  There has not be
24a90 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  en an opportunit
24aa0 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a  y to transition.
24ab0 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65    ** to WAL mode
24ac0 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   yet..  */.  ass
24ad0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
24ae0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
24af0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
24b00 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f  r->fd) ){.    IO
24b10 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
24b20 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
24b30 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
24b40 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
24b50 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
24b60 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
24b70 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
24b80 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
24b90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24ba0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
24bb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24bc0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24bd0 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  n may only be ca
24be0 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64  lled when a read
24bf0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
24c00 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  open on.** the p
24c10 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73  ager. It returns
24c20 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
24c30 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
24c40 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
24c50 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
24c60 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
24c70 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
24c80 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
24c90 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
24ca0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
24cb0 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f   1 page file..*/
24cc0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
24cd0 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
24ce0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
24cf0 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  pnPage){.  asser
24d00 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
24d10 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
24d20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
24d30 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
24d40 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
24d50 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20  ED );.  *pnPage 
24d60 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64  = (int)pPager->d
24d70 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  bSize;.}.../*.**
24d80 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
24d90 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
24da0 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
24db0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
24dc0 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
24dd0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
24de0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
24df0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
24e00 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
24e10 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
24e20 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
24e30 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
24e40 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
24e50 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
24e60 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
24e70 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
24e80 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
24e90 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
24ea0 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
24eb0 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
24ec0 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
24ed0 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
24ee0 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
24ef0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
24f00 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
24f10 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
24f20 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
24f30 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
24f40 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
24f50 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
24f60 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
24f70 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
24f80 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
24f90 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
24fa0 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
24fb0 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
24fc0 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
24fd0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
24fe0 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
24ff0 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
25000 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
25010 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
25020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25040 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
25050 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
25060 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20  his is either a 
25070 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74  no-op (because t
25080 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
25090 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61  k is .  ** alrea
250a0 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65  dy held), or one
250b0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
250c0 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73  ons that the bus
250d0 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d  y-handler.  ** m
250e0 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75  ay be invoked du
250f0 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20  ring, according 
25100 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  to the comment a
25110 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  bove.  ** sqlite
25120 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
25130 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  dler()..  */.  a
25140 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
25150 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29  eLock>=locktype)
25160 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
25170 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
25180 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
25190 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
251a0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
251b0 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
251c0 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
251d0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
251e0 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20  ).  );..  do {. 
251f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
25200 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b  kDb(pPager, lock
25210 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
25220 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
25230 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73   && pPager->xBus
25240 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
25250 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
25260 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
25270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  ;.}../*.** Funct
25280 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61  ion assertTrunca
25290 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
252a0 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74  ger) checks that
252b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
252c0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
252d0 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20  e for all dirty 
252e0 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
252f0 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
25300 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68  e:.**.**   a) Th
25310 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
25320 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
25330 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ual to the size 
25340 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  of the .**      
25350 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
25360 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73   image, in pages
25370 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  , OR.**.**   b) 
25380 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  if the page cont
25390 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e  ent were written
253a0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69   at this time, i
253b0 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20  t would not.**  
253c0 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79      be necessary
253d0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
253e0 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75  rrent content ou
253f0 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  t to the sub-jou
25400 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73  rnal.**      (as
25410 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66   determined by f
25420 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75  unction subjRequ
25430 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a  iresPage())..**.
25440 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74  ** If the condit
25450 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20  ion asserted by 
25460 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65  this function we
25470 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64  re not true, and
25480 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
25490 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69  ge were to be di
254a0 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65  scarded from the
254b0 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70   cache via the p
254c0 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20  agerStress().** 
254d0 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74  routine, pagerSt
254e0 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74  ress() would not
254f0 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
25500 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
25510 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  to.** the databa
25520 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61  se file. If a sa
25530 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74  vepoint transact
25540 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20  ion were rolled 
25550 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68  back after.** th
25560 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65  is happened, the
25570 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
25580 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65  r would be to re
25590 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
255a0 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t.** content of 
255b0 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65  the page. Howeve
255c0 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  r, since this co
255d0 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65  ntent is not pre
255e0 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a  sent in either.*
255f0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
25600 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69  ile or the porti
25610 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  on of the rollba
25620 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a  ck journal and .
25630 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72  ** sub-journal r
25640 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63  olled back the c
25650 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74  ontent could not
25660 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
25670 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
25680 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63   image would bec
25690 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20  ome corrupt. It 
256a0 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72  is therefore for
256b0 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20  tunate that .** 
256c0 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63  this circumstanc
256d0 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a  e cannot arise..
256e0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
256f0 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
25700 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
25710 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25720 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tCb(PgHdr *pPg){
25730 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
25740 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
25750 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  Y );.  assert( !
25760 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
25770 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
25780 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  no<=pPg->pPager-
25790 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61  >dbSize );.}.sta
257a0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
257b0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
257c0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
257d0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
257e0 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
257f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61  ager->pPCache, a
25800 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25810 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65  straintCb);.}.#e
25820 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
25830 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25840 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65  raint(pPager).#e
25850 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
25860 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
25870 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
25880 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
25890 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20  pages. This .** 
258a0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
258b0 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
258c0 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
258d0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20  ile on disk. It 
258e0 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68  .** just sets th
258f0 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
25900 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   of the pager ob
25910 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
25920 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20   .** truncation 
25930 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65  will be done whe
25940 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
25950 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
25960 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
25970 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
25980 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74  nly called right
25990 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
259a0 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
259b0 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66  ..** Once this f
259c0 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  unction has been
259d0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61   called, the tra
259e0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69  nsaction must ei
259f0 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65  ther be.** rolle
25a00 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  d back or commit
25a10 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73  ted. It is not s
25a20 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  afe to call this
25a30 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a   function and.**
25a40 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77   then continue w
25a50 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
25a60 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  tabase..*/.void 
25a70 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
25a80 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
25a90 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
25aa0 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
25ab0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
25ac0 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
25ad0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
25ae0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
25af0 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50  CACHEMOD );.  pP
25b00 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
25b10 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f  Page;..  /* At o
25b20 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64  ne point the cod
25b30 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73  e here called as
25b40 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
25b50 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a  traint() to.  **
25b60 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c   ensure that all
25b70 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75   pages being tru
25b80 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74  ncated away by t
25b90 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72  his operation ar
25ba0 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f  e,.  ** if one o
25bb0 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
25bc0 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73  s are open, pres
25bd0 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70  ent in the savep
25be0 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  oint .  ** journ
25bf0 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  al so that they 
25c00 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
25c10 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  if the savepoint
25c20 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20   is rolled.  ** 
25c30 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f  back. This is no
25c40 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72   longer necessar
25c50 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69  y as this functi
25c60 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20  on is now only. 
25c70 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74   ** called right
25c80 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
25c90 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
25ca0 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68  . So although th
25cb0 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62  e .  ** Pager ob
25cc0 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68  ject may still h
25cd0 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ave open savepoi
25ce0 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65  nts (Pager.nSave
25cf0 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a  point!=0), .  **
25d00 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20   they cannot be 
25d10 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20  rolled back. So 
25d20 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  the assertTrunca
25d30 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63  teConstraint() c
25d40 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c  all.  ** is no l
25d50 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a  onger correct. *
25d60 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.}.../*.** This
25d70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
25d80 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  led before attem
25d90 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  pting a hot-jour
25da0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74  nal rollback. It
25db0 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f  .** syncs the jo
25dc0 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69  urnal file to di
25dd0 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50  sk, then sets pP
25de0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
25df0 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20   to the.** size 
25e00 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
25e10 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ile so that the 
25e20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
25e30 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a   routine knows.*
25e40 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72  * that the entir
25e50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
25e60 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  as been synced..
25e70 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20  **.** Syncing a 
25e80 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64  hot-journal to d
25e90 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d  isk before attem
25ea0 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
25eb0 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a   back ensures .*
25ec0 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  * that if a powe
25ed0 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r-failure occurs
25ee0 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
25ef0 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73  back, the proces
25f00 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70  s that.** attemp
25f10 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  ts rollback foll
25f20 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63  owing system rec
25f30 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73  overy sees the s
25f40 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63  ame journal.** c
25f50 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70  ontent as this p
25f60 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  rocess..**.** If
25f70 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
25f80 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c   as planned, SQL
25f90 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
25fa0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  ed. Otherwise, .
25fb0 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
25fc0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
25fd0 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63  ic int pagerSync
25fe0 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
25ff0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
26000 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26010 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
26020 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
26030 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
26040 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
26050 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
26060 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
26070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26090 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
260a0 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a  >jfd, &pPager->j
260b0 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a  ournalHdr);.  }.
260c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
260d0 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72  /*.** Obtain a r
260e0 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65  eference to a me
260f0 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
26100 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65   object for page
26110 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a   number pgno. .*
26120 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * The new object
26130 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f   will use the po
26140 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74  inter pData, obt
26150 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63  ained from xFetc
26160 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  h()..** If succe
26170 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61  ssful, set *ppPa
26180 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ge to point to t
26190 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65  he new page refe
261a0 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74  rence.** and ret
261b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
261c0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
261d0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
261e0 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a   code and set.**
261f0 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f   *ppPage to zero
26200 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66  ..**.** Page ref
26210 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64  erences obtained
26220 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
26230 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
26240 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   be released.** 
26250 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72  by calling pager
26260 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29  ReleaseMapPage()
26270 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26280 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
26290 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
262a0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
262b0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
262c0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f  object */.  Pgno
262d0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
262e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
262f0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
26300 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20  void *pData,    
26310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26320 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61  /* xFetch()'d da
26330 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ta for this page
26340 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70   */.  PgHdr **pp
26350 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20  Page            
26360 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63        /* OUT: Ac
26370 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65  quired page obje
26380 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ct */.){.  PgHdr
26390 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
263a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
263b0 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
263c0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
263d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d   if( pPager->pMm
263e0 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20  apFreelist ){.  
263f0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20    *ppPage = p = 
26400 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
26410 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65  elist;.    pPage
26420 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
26430 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
26440 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b    p->pDirty = 0;
26450 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70  .    memset(p->p
26460 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67 65 72  Extra, 0, pPager
26470 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c  ->nExtra);.  }el
26480 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
26490 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73  = p = (PgHdr *)s
264a0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
264b0 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b  (sizeof(PgHdr) +
264c0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
264d0 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
264e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
264f0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
26500 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d  >fd, (i64)(pgno-
26510 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67  1) * pPager->pag
26520 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20  eSize, pData);. 
26530 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26540 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
26550 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20 3d 20      p->pExtra = 
26560 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20  (void *)&p[1];. 
26570 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47     p->flags = PG
26580 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d  HDR_MMAP;.    p-
26590 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
265a0 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
265b0 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  r;.  }..  assert
265c0 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f  ( p->pExtra==(vo
265d0 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20  id *)&p[1] );.  
265e0 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65  assert( p->pPage
265f0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
26600 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52   p->flags==PGHDR
26610 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73 65 72  _MMAP );.  asser
26620 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50  t( p->pPager==pP
26630 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
26640 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a  ( p->nRef==1 );.
26650 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  .  p->pgno = pgn
26660 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d 20  o;.  p->pData = 
26670 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65 72 2d  pData;.  pPager-
26680 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20  >nMmapOut++;..  
26690 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
266a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
266b0 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  se a reference t
266c0 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50 67 20  o page pPg. pPg 
266d0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72  must have been r
266e0 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a  eturned by an .*
266f0 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  * earlier call t
26700 6f 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61  o pagerAcquireMa
26710 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  pPage()..*/.stat
26720 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 6c  ic void pagerRel
26730 65 61 73 65 4d 61 70 50 61 67 65 28 50 67 48 64  easeMapPage(PgHd
26740 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
26750 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
26760 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67 65 72  pPager;.  pPager
26770 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20  ->nMmapOut--;.  
26780 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  pPg->pDirty = pP
26790 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
267a0 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ist;.  pPager->p
267b0 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70  MmapFreelist = p
267c0 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
267d0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
267e0 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33  ods->iVersion>=3
267f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55   );.  sqlite3OsU
26800 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
26810 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e 70 67  d, (i64)(pPg->pg
26820 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61  no-1)*pPager->pa
26830 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61  geSize, pPg->pDa
26840 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ta);.}../*.** Fr
26850 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a  ee all PgHdr obj
26860 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74  ects stored in t
26870 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70 46 72  he Pager.pMmapFr
26880 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a  eelist list..*/.
26890 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
268a0 72 46 72 65 65 4d 61 70 48 64 72 73 28 50 61 67  rFreeMapHdrs(Pag
268b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
268c0 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48 64 72  gHdr *p;.  PgHdr
268d0 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
268e0 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72  =pPager->pMmapFr
268f0 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65  eelist; p; p=pNe
26900 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
26910 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
26920 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
26930 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  .  }.}.../*.** S
26940 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
26950 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
26960 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
26970 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
26980 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
26990 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
269a0 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
269b0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
269c0 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
269d0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
269e0 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
269f0 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
26a00 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
26a10 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
26a20 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
26a30 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
26a40 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
26a50 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
26a60 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
26a70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
26a80 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
26a90 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
26aa0 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
26ab0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
26ac0 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
26ad0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
26ae0 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
26af0 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
26b00 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
26b10 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
26b20 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
26b30 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
26b40 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
26b50 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
26b60 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
26b70 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
26b80 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
26b90 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
26ba0 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
26bb0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38  r *pPager){.  u8
26bc0 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70   *pTmp = (u8 *)p
26bd0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
26be0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  ;..  assert( ass
26bf0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
26c00 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73  pPager) );.  dis
26c10 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
26c20 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
26c30 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
26c40 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65  Malloc();.  page
26c50 72 46 72 65 65 4d 61 70 48 64 72 73 28 70 50 61  rFreeMapHdrs(pPa
26c60 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  ger);.  /* pPage
26c70 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20  r->errCode = 0; 
26c80 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  */.  pPager->exc
26c90 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
26ca0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26cb0 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65  MIT_WAL.  sqlite
26cc0 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72  3WalClose(pPager
26cd0 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ->pWal, pPager->
26ce0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70  ckptSyncFlags, p
26cf0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
26d00 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67 65 72   pTmp);.  pPager
26d10 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64  ->pWal = 0;.#end
26d20 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  if.  pager_reset
26d30 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
26d40 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67  MEMDB ){.    pag
26d50 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
26d60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26d70 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e  /* If it is open
26d80 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
26d90 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  al file before c
26da0 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64  alling UnlockAnd
26db0 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a  Rollback..    **
26dc0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
26dd0 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e  done, then an un
26de0 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
26df0 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
26e00 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  al .    ** file 
26e10 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20 62 61  may be played ba
26e20 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
26e30 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
26e40 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
26e50 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68  .    ** while th
26e60 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c  is is happening,
26e70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
26e80 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
26e90 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  pt..    **.    *
26ea0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
26eb0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
26ec0 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f  g to sync the jo
26ed0 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65  urnal, shift the
26ee0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e   pager.    ** in
26ef0 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
26f00 74 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  te. This causes 
26f10 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
26f20 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  k to unlock the.
26f30 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
26f40 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f  and close the jo
26f50 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f  urnal file witho
26f60 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ut attempting to
26f70 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20   roll it.    ** 
26f80 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65  back or finalize
26f90 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61   it. The next da
26fa0 74 61 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c  tabase user will
26fb0 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d   have to do hot-
26fc0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72  journal.    ** r
26fd0 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61  ollback before a
26fe0 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74  ccessing the dat
26ff0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
27000 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  */.    if( isOpe
27010 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
27020 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
27030 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67 65  ror(pPager, page
27040 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
27050 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
27060 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
27070 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
27080 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
27090 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
270a0 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ();.  enable_sim
270b0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
270c0 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ();.  PAGERTRACE
270d0 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
270e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
270f0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
27100 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
27110 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73  er)).  sqlite3Os
27120 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
27130 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  d);.  sqlite3OsC
27140 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
27150 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
27160 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c  ree(pTmp);.  sql
27170 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
27180 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
27190 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
271a0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
271b0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
271c0 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
271d0 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
271e0 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66  >pCodec);.#endif
271f0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
27200 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
27210 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  && !pPager->pInJ
27220 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
27230 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
27240 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f  er->jfd) && !isO
27250 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
27260 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ) );..  sqlite3_
27270 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
27280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27290 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
272a0 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
272b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
272c0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
272d0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
272e0 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
272f0 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
27300 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
27310 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
27320 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a  rn pPg->pgno;.}.
27330 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
27340 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
27350 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
27360 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69  page pPg..*/.voi
27370 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
27380 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
27390 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
273a0 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ef(pPg);.}../*.*
273b0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
273c0 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  al. In other wor
273d0 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
273e0 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
273f0 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
27400 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
27410 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
27420 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
27430 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
27440 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65   disk and can be
27450 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65   restored in the
27460 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d   event of a hot-
27470 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
27480 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
27490 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
274a0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
274b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
274c0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
274d0 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e  wise, the action
274e0 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e  s required depen
274f0 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
27500 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a  -mode and the .*
27510 2a 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  * device charact
27520 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20  eristics of the 
27530 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20  file-system, as 
27540 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
27550 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
27560 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d  l file is an in-
27570 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
27580 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e  ile, no action n
27590 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61  eed.**     be ta
275a0 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f  ken..**.**   * O
275b0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
275c0 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
275d0 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46   support the SAF
275e0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
275f0 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74  y,.**     then t
27600 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66  he nRec field of
27610 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
27620 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e  ly written journ
27630 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  al header.**    
27640 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63   is updated to c
27650 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
27660 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63  r of journal rec
27670 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ords that have.*
27680 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74  *     been writt
27690 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e  en following it.
276a0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
276b0 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75   operating in fu
276c0 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d  ll-sync.**     m
276d0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
276e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
276f0 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nced before this
27700 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
27710 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  d..**.**   * If 
27720 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
27730 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
27740 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65  SEQUENTIAL prope
27750 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20  rty, then .**   
27760 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
27770 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
27780 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f  Or, in pseudo-co
27790 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  de:.**.**   if( 
277a0 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a  NOT <in-memory j
277b0 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20  ournal> ){.**   
277c0 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41    if( NOT SAFE_A
277d0 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20  PPEND ){.**     
277e0 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63    if( <full-sync
277f0 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c   mode> ) xSync(<
27800 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
27810 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65  **       <update
27820 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20   nRec field>.** 
27830 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66      } .**     if
27840 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c  ( NOT SEQUENTIAL
27850 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
27860 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d  l file>);.**   }
27870 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
27880 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  sful, this routi
27890 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47  ne clears the PG
278a0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
278b0 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20  ag of every .** 
278c0 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68  page currently h
278d0 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65  eld in memory be
278e0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53  fore returning S
278f0 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
27900 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65  IO.** error is e
27910 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
27920 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
27930 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
27940 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
27950 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
27960 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
27970 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64  Pager, int newHd
27980 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
27990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
279b0 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
279c0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
279d0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
279e0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
279f0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
27a00 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
27a10 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
27a20 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
27a30 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
27a40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  );.  assert( !pa
27a50 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
27a60 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ) );..  rc = sql
27a70 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
27a80 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  veLock(pPager);.
27a90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27aa0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
27ab0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
27ac0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  >noSync ){.    a
27ad0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
27ae0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
27af0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
27b00 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
27b10 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
27b20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
27b30 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
27b40 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20    const int iDc 
27b50 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
27b60 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
27b70 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
27b80 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
27b90 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
27ba0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
27bb0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
27bc0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
27bd0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
27be0 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  is block deals w
27bf0 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70  ith an obscure p
27c00 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c  roblem. If the l
27c10 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  ast connection. 
27c20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
27c30 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74  rote to this dat
27c40 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74  abase was operat
27c50 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e  ing in persisten
27c60 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t-journal.      
27c70 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
27c80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27c90 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69   may at this poi
27ca0 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c  nt actually be l
27cb0 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  arger.        **
27cc0 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72   than Pager.jour
27cd0 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66  nalOff bytes. If
27ce0 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20   the next thing 
27cf0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  in the journal. 
27d00 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68         ** file h
27d10 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a  appens to be a j
27d20 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77  ournal-header (w
27d30 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f  ritten as part o
27d40 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
27d50 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63   previous connec
27d60 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69  tion's transacti
27d70 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68  on), and a crash
27d80 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72   or power-failur
27d90 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63  e .        ** oc
27da0 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20  curs after nRec 
27db0 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62  is updated but b
27dc0 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65  efore this conne
27dd0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20  ction writes .  
27de0 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e        ** anythin
27df0 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f  g else to the jo
27e00 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63  urnal file (or c
27e10 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63  ommits/rolls bac
27e20 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a  k its .        *
27e30 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  * transaction), 
27e40 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20  then SQLite may 
27e50 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20  become confused 
27e60 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a  when doing the .
27e70 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a          ** hot-j
27e80 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
27e90 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65  following recove
27ea0 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20  ry. It may roll 
27eb0 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20  back all.       
27ec0 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   ** of this conn
27ed0 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68  ections data, th
27ee0 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f  en proceed to ro
27ef0 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f  lling back the o
27f00 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ld,.        ** o
27f10 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20  ut-of-date data 
27f20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e  that follows it.
27f30 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
27f40 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tion..        **
27f50 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77  .        ** To w
27f60 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c  ork around this,
27f70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
27f80 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72  file does appear
27f90 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20   to contain.    
27fa0 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68      ** a valid h
27fb0 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  eader following 
27fc0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
27fd0 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30  , then write a 0
27fe0 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  x00.        ** b
27ff0 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74  yte to the start
28000 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e   of it to preven
28010 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20  t it from being 
28020 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20  recognized..    
28030 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
28040 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74  * Variable iNext
28050 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74  HdrOffset is set
28060 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61   to the offset a
28070 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20  t which this.   
28080 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61       ** problema
28090 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20  tic header will 
280a0 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69  occur, if it exi
280b0 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75  sts. aMagic is u
280c0 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  sed .        ** 
280d0 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62  as a temporary b
280e0 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74  uffer to inspect
280f0 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c   the first coupl
28100 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20  e of bytes of.  
28110 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74        ** the pot
28120 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68  ential journal h
28130 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a  eader..        *
28140 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e  /.        i64 iN
28150 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20  extHdrOffset;.  
28160 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b        u8 aMagic[
28170 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a  8];.        u8 z
28180 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
28190 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b  ournalMagic)+4];
281a0 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ..        memcpy
281b0 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
281c0 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
281d0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
281e0 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69  .        put32bi
281f0 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
28200 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
28210 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  )], pPager->nRec
28220 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78  );..        iNex
28230 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75  tHdrOffset = jou
28240 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
28250 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72  ager);.        r
28260 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
28270 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
28280 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48  Magic, 8, iNextH
28290 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
282a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
282b0 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  E_OK && 0==memcm
282c0 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
282d0 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20  alMagic, 8) ){. 
282e0 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
282f0 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74  const u8 zerobyt
28300 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
28310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
28320 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
28330 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20  , &zerobyte, 1, 
28340 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
28350 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28360 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28370 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
28380 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
28390 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
283a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
283b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
283c0 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
283d0 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
283e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
283f0 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
28400 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
28410 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
28420 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
28430 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
28440 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
28450 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
28460 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
28470 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
28480 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
28490 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
284a0 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
284b0 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  or rollback..   
284c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
284d0 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  ** This is not r
284e0 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70  equired if the p
284f0 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20  ersistent media 
28500 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20  supports the.   
28510 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50       ** SAFE_APP
28520 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65  END property. Be
28530 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61  cause in this ca
28540 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
28550 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a  sible .        *
28560 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61  * for garbage da
28570 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  ta to be appende
28580 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74  d to the file, t
28590 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20  he nRec field.  
285a0 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75        ** is popu
285b0 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46  lated with 0xFFF
285c0 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a  FFFFF when the j
285d0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
285e0 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
285f0 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65   ** and never ne
28600 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
28610 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
28620 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
28630 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d  ->fullSync && 0=
28640 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
28650 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
28660 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
28670 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
28680 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
28690 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
286a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
286b0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
286c0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
286d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
286e0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
286f0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
28700 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  yncFlags);.     
28710 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28720 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
28730 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
28740 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
28750 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  JHDR %p %lld\n",
28760 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
28770 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20  >journalHdr));. 
28780 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28790 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20  te3OsWrite(.    
287a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
287b0 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
287c0 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70  zeof(zHeader), p
287d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
287e0 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
287f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28800 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
28810 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
28820 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
28830 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
28840 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
28850 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
28860 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
28870 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
28880 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
28890 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
288a0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
288b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
288c0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
288d0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
288e0 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20  >syncFlags| .   
288f0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
28900 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54  syncFlags==SQLIT
28910 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
28920 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
28930 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
28940 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28950 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
28960 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
28970 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
28980 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
28990 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
289a0 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26      if( newHdr &
289b0 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
289c0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
289d0 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ND) ){.        p
289e0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
289f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
28a00 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
28a10 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
28a20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28a30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28a40 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
28a50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
28a60 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
28a70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
28a80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
28a90 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  Unless the pager
28aa0 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f   is in noSync mo
28ab0 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  de, the journal 
28ac0 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20  file was just . 
28ad0 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79   ** successfully
28ae0 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20   synced. Either 
28af0 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50  way, clear the P
28b00 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
28b10 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c  lag on .  ** all
28b20 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73   pages..  */.  s
28b30 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
28b40 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65  rSyncFlags(pPage
28b50 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70  r->pPCache);.  p
28b60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
28b70 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
28b80 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73  OD;.  assert( as
28b90 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
28ba0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
28bb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28bc0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
28bd0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ument is the fir
28be0 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  st in a linked l
28bf0 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
28c00 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  es connected.** 
28c10 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
28c20 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69  rty pointer. Thi
28c30 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  s function write
28c40 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68  s each one of th
28c50 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  e.** in-memory p
28c60 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
28c70 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
28c80 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d   file. The argum
28c90 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55  ent may.** be NU
28ca0 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67  LL, representing
28cb0 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20   an empty list. 
28cc0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
28cd0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
28ce0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
28cf0 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68  The pager must h
28d00 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52  old at least a R
28d10 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65  ESERVED lock whe
28d20 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
28d30 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65  ** is called. Be
28d40 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79  fore writing any
28d50 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  thing to the dat
28d60 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
28d70 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72   lock.** is upgr
28d80 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55  aded to an EXCLU
28d90 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68  SIVE lock. If th
28da0 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
28db0 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51   obtained,.** SQ
28dc0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
28dd0 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74  urned and no dat
28de0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
28df0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28e00 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  e..** .** If the
28e10 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70   pager is a temp
28e20 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20  -file pager and 
28e30 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d  the actual file-
28e40 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69  system file.** i
28e50 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20  s not yet open, 
28e60 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  it is created an
28e70 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  d opened before 
28e80 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20  any data is .** 
28e90 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a  written out..**.
28ea0 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b  ** Once the lock
28eb0 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64   has been upgrad
28ec0 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ed and, if neces
28ed0 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f  sary, the file o
28ee0 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61  pened,.** the pa
28ef0 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
28f00 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
28f10 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74  ase file in list
28f20 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a   order. Writing.
28f30 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69  ** a page is ski
28f40 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73  pped if it meets
28f50 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66   either of the f
28f60 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
28f70 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  a:.**.**   * The
28f80 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
28f90 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67  greater than Pag
28fa0 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a  er.dbSize, or.**
28fb0 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44     * The PGHDR_D
28fc0 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69  ONT_WRITE flag i
28fd0 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67  s set on the pag
28fe0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74  e..**.** If writ
28ff0 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63  ing out a page c
29000 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
29010 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
29020 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
29030 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20  e.** is updated 
29040 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
29050 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65  page 1 is writte
29060 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20  n out, then the 
29070 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20  value cached.** 
29080 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  in Pager.dbFileV
29090 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64  ers[] is updated
290a0 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65   to match the ne
290b0 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  w value stored i
290c0 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
290d0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
290e0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
290f0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
29100 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
29110 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
29120 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20   .** occurs, an 
29130 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
29140 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
29150 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
29160 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62  lock cannot.** b
29170 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49  e obtained, SQLI
29180 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
29190 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
291a0 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
291b0 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70  agelist(Pager *p
291c0 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c  Pager, PgHdr *pL
291d0 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ist){.  int rc =
291e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29200 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
29210 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
29220 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
29230 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70  d for rollback p
29240 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f  agers in WRITER_
29250 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a  DBMOD state. */.
29260 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
29270 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
29280 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29290 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
292a0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29  R_WRITER_DBMOD )
292b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
292c0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
292d0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
292e0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
292f0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61  s a temp-file ha
29300 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
29310 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
29320 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e  ow. It.  ** is n
29330 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
29340 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74  rc to be other t
29350 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  han SQLITE_OK if
29360 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
29370 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70  * is taken, as p
29380 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
29390 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
293a0 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20  or temp-files.. 
293b0 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
293c0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
293d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
293e0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
293f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29400 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
29410 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
29420 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61   pPager->fd, pPa
29430 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
29440 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
29450 20 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65   the first write
29460 2c 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61  , give the VFS a
29470 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68   hint of what th
29480 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  e final.  ** fil
29490 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a  e size will be..
294a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72    */.  assert( r
294b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
294c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
294d0 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  d) );.  if( rc==
294e0 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26  SQLITE_OK .   &&
294f0 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
29500 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
29510 7a 65 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d  ze.   && (pList-
29520 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74  >pDirty || pList
29530 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
29540 62 48 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a  bHintSize).  ){.
29550 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
29560 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65  4 szFile = pPage
29570 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73  r->pageSize * (s
29580 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61  qlite3_int64)pPa
29590 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
295a0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
295b0 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
295c0 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
295d0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73  TL_SIZE_HINT, &s
295e0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67  zFile);.    pPag
295f0 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
29600 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
29610 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
29620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29630 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e  pList ){.    Pgn
29640 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e  o pgno = pList->
29650 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pgno;..    /* If
29660 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
29670 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
29680 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
29690 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
296a0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
296b0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
296c0 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
296d0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
296e0 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
296f0 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
29700 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
29710 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
29720 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
29730 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
29740 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
29750 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
29760 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
29770 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  lso, do not writ
29780 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74  e out any page t
29790 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44  hat has the PGHD
297a0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
297b0 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65  g.    ** set (se
297c0 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
297d0 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20  rDontWrite()).. 
297e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
297f0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
29800 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
29810 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
29820 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
29830 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
29840 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
29850 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
29860 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72   /* Offset to wr
29870 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ite */.      cha
29880 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  r *pData;       
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
298b0 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20  ata to write */ 
298c0 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72     ..      asser
298d0 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  t( (pList->flags
298e0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
298f0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
29900 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
29910 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63   ) pager_write_c
29920 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69  hangecounter(pLi
29930 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  st);..      /* E
29940 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61  ncode the databa
29950 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45  se */.      CODE
29960 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  C2(pPager, pList
29970 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36  ->pData, pgno, 6
29980 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
29990 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a  NOMEM, pData);..
299a0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f        /* Write o
299b0 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ut the page data
299c0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
299d0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
299e0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
299f0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
29a00 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20  ze, offset);..  
29a10 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31      /* If page 1
29a20 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65   was just writte
29a30 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e  n, update Pager.
29a40 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61  dbFileVers to ma
29a50 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  tch.      ** the
29a60 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65   value now store
29a70 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
29a80 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69  e file. If writi
29a90 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a  ng this .      *
29aa0 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68  * page caused th
29ab0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29ac0 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20  to grow, update 
29ad0 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20  dbFileSize. .   
29ae0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
29af0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
29b00 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
29b10 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
29b20 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f  pData[24], sizeo
29b30 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
29b40 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
29b50 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
29b60 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
29b70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  e ){.        pPa
29b80 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
29b90 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  = pgno;.      }.
29ba0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
29bb0 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57  tat[PAGER_STAT_W
29bc0 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20  RITE]++;..      
29bd0 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61  /* Update any ba
29be0 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70  ckup objects cop
29bf0 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
29c00 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e  s of this pager.
29c10 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
29c20 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
29c30 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
29c40 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d  gno, (u8*)pList-
29c50 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >pData);..      
29c60 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f  PAGERTRACE(("STO
29c70 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61  RE %d page %d ha
29c80 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
29c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ca0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
29cb0 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
29cc0 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a  ehash(pList)));.
29cd0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
29ce0 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
29cf0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
29d00 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
29d10 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
29d20 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  ritedb_count);. 
29d30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29d40 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
29d50 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
29d60 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
29d70 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  er), pgno));.   
29d80 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
29d90 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
29da0 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  ;.    pList = pL
29db0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
29dc0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
29dd0 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74  ../*.** Ensure t
29de0 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  hat the sub-jour
29df0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
29e00 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
29e10 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a  dy open, this .*
29e20 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
29e30 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  no-op..**.** SQL
29e40 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
29e50 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
29e60 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20   goes according 
29e70 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20  to plan. An .** 
29e80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
29e90 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
29ea0 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c  eturned if a cal
29eb0 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70  l to sqlite3OsOp
29ec0 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a  en() .** fails..
29ed0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
29ee0 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67  enSubJournal(Pag
29ef0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
29f00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
29f10 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  K;.  if( !isOpen
29f20 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
29f30 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
29f40 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
29f50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
29f60 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65  _MEMORY || pPage
29f70 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
29f80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29f90 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
29fa0 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
29fb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
29fc0 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
29fd0 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
29fe0 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f  ->sjfd, SQLITE_O
29ff0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b  PEN_SUBJOURNAL);
2a000 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2a010 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a020 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64   Append a record
2a030 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2a040 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50  state of page pP
2a050 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  g to the sub-jou
2a060 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20  rnal. .** It is 
2a070 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
2a080 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73  onsibility to us
2a090 65 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  e subjRequiresPa
2a0a0 67 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a  ge() to check .*
2a0b0 2a 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61  * that it is rea
2a0c0 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66  lly required bef
2a0d0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
2a0e0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
2a0f0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2a100 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72  set the bit corr
2a110 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67  esponding to pPg
2a120 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69  ->pgno in the bi
2a130 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c  tvecs.** for all
2a140 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
2a150 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2a160 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  g..**.** This fu
2a170 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
2a180 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
2a190 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
2a1a0 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65  sful, an IO.** e
2a1b0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65  rror code if the
2a1c0 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
2a1d0 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  e to the sub-jou
2a1e0 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
2a1f0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
2a200 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
2a210 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20  s while setting 
2a220 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70  a bit in a savep
2a230 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a  oint.** bitvec..
2a240 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
2a250 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48  bjournalPage(PgH
2a260 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20  dr *pPg){.  int 
2a270 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a280 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2a290 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
2a2a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
2a2b0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
2a2c0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
2a2d0 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ){..    /* Open 
2a2e0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c  the sub-journal,
2a2f0 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
2a300 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
2a310 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ed */.    assert
2a320 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2a330 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  rnal );.    asse
2a340 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2a350 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72  r->jfd) || pager
2a360 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2a370 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
2a380 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
2a390 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53  d) || pPager->nS
2a3a0 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  ubRec==0 );.    
2a3b0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
2a3c0 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20  Wal(pPager) .   
2a3d0 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a        || pageInJ
2a3e0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70  ournal(pPager, p
2a3f0 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  Pg) .         ||
2a400 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
2a410 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
2a420 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f     );.    rc = o
2a430 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
2a440 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ager);..    /* I
2a450 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
2a460 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63  l was opened suc
2a470 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61  cessfully (or wa
2a480 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
2a490 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68  .    ** write th
2a4a0 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
2a4b0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
2a4c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2a4d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a4e0 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
2a4f0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
2a500 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
2a510 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75  (i64)pPager->nSu
2a520 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
2a530 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
2a540 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
2a550 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70   .      CODEC2(p
2a560 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
2a570 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
2a580 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
2a590 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
2a5a0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d  PAGERTRACE(("STM
2a5b0 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
2a5c0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2a5d0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2a5e0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
2a5f0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
2a600 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
2a610 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
2a620 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2a630 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a640 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2a650 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
2a660 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
2a670 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
2a680 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20  ffset+4);.      
2a690 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
2a6a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a6b0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
2a6c0 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
2a6d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
2a6e0 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
2a6f0 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
2a700 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
2a710 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
2a720 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2a740 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2a750 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
2a760 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
2a770 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
2a780 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
2a790 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
2a7a0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
2a7b0 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
2a7c0 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
2a7d0 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
2a7e0 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
2a7f0 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
2a800 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
2a810 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
2a820 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a830 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
2a840 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
2a850 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
2a860 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
2a870 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
2a880 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
2a890 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
2a8a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2a8b0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
2a8c0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
2a8d0 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
2a8e0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
2a8f0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2a900 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
2a910 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
2a920 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
2a930 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
2a940 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
2a950 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
2a960 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
2a970 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
2a980 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
2a990 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
2a9a0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2a9b0 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
2a9c0 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
2a9d0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2a9e0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2a9f0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2aa00 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
2aa10 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
2aa20 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
2aa30 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2aa40 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
2aa50 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
2aa60 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
2aa70 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
2aa80 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
2aa90 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
2aaa0 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
2aab0 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
2aac0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
2aad0 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
2aae0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2aaf0 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
2ab00 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
2ab10 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
2ab20 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
2ab30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ab40 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
2ab50 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
2ab60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
2ab70 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2ab80 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
2ab90 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59   doNotSpill NOSY
2aba0 4e 43 20 62 69 74 20 69 73 20 73 65 74 20 64 75  NC bit is set du
2abb0 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20  ring times when 
2abc0 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a  doing a sync of.
2abd0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e    ** journal (an
2abe0 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68  d adding a new h
2abf0 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c  eader) is not al
2ac00 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63  lowed.  This occ
2ac10 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
2ac20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
2ac30 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69  PagerWrite() whi
2ac40 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75  le trying to jou
2ac50 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20  rnal multiple.  
2ac60 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69  ** pages belongi
2ac70 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  ng to the same s
2ac80 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ector..  **.  **
2ac90 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
2aca0 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46  ROLLBACK and OFF
2acb0 20 62 69 74 73 20 69 6e 68 69 62 69 74 73 20 61   bits inhibits a
2acc0 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e  ll cache spillin
2acd0 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73  g.  ** regardles
2ace0 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  s of whether or 
2acf0 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65  not a sync is re
2ad00 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73  quired.  This is
2ad10 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a   set during.  **
2ad20 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62   a rollback or b
2ad30 79 20 75 73 65 72 20 72 65 71 75 65 73 74 2c 20  y user request, 
2ad40 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20  respectively..  
2ad50 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67  **.  ** Spilling
2ad60 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69   is also prohibi
2ad70 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65  ted when in an e
2ad80 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65  rror state since
2ad90 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a   that could.  **
2ada0 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
2adb0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20  e corruption.   
2adc0 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
2add0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74  mplementation it
2ade0 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73   .  ** is imposs
2adf0 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ible for sqlite3
2ae00 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f  PcacheFetch() to
2ae10 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
2ae20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20  createFlag==3.  
2ae30 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  ** while in the 
2ae40 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e  error state, hen
2ae50 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  ce it is impossi
2ae60 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
2ae70 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20  tine to.  ** be 
2ae80 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72  called in the er
2ae90 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65  ror state.  Neve
2aea0 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63  rtheless, we inc
2aeb0 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20  lude a NEVER(). 
2aec0 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65   ** test for the
2aed0 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20   error state as 
2aee0 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69  a safeguard agai
2aef0 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67  nst future chang
2af00 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e  es..  */.  if( N
2af10 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
2af20 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53  Code) ) return S
2af30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74  QLITE_OK;.  test
2af40 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f  case( pPager->do
2af50 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
2af60 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  FLAG_ROLLBACK );
2af70 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2af80 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2af90 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20  & SPILLFLAG_OFF 
2afa0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2afb0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2afc0 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  l & SPILLFLAG_NO
2afd0 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50  SYNC );.  if( pP
2afe0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2aff0 0a 20 20 20 26 26 20 28 28 70 50 61 67 65 72 2d  .   && ((pPager-
2b000 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53  >doNotSpill & (S
2b010 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
2b020 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29  K|SPILLFLAG_OFF)
2b030 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70  )!=0.      || (p
2b040 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
2b050 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29  R_NEED_SYNC)!=0)
2b060 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2b070 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2b080 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
2b090 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55   0;.  if( pagerU
2b0a0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
2b0b0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  .    /* Write a 
2b0c0 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72  single frame for
2b0d0 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68   this page to th
2b0e0 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66  e log. */.    if
2b0f0 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
2b100 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20  ge(pPg) ){ .    
2b110 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
2b120 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20  lPage(pPg); .   
2b130 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2b140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b150 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46    rc = pagerWalF
2b160 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50  rames(pPager, pP
2b170 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  g, 0, 0);.    }.
2b180 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
2b190 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
2b1a0 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75  nal file if requ
2b1b0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ired. */.    if(
2b1c0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2b1d0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20  R_NEED_SYNC .   
2b1e0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
2b1f0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
2b200 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29  R_CACHEMOD.    )
2b210 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  {.      rc = syn
2b220 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  cJournal(pPager,
2b230 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   1);.    }.  .  
2b240 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
2b250 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20   number of this 
2b260 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74  page is larger t
2b270 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
2b280 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  size of.    ** t
2b290 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
2b2a0 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74  e, it may need t
2b2b0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  o be written to 
2b2c0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
2b2d0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
2b2e0 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
2b2f0 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f   to pager_write_
2b300 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77  pagelist() below
2b310 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a   will not.    **
2b320 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20   actually write 
2b330 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
2b340 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
2b350 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e     **.    ** Con
2b360 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
2b370 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
2b380 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20  events:.    **. 
2b390 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20     **   BEGIN;. 
2b3a0 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e     **     <journ
2b3b0 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a  al page X>.    *
2b3c0 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61  *     <modify pa
2b3d0 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ge X>.    **    
2b3e0 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20   SAVEPOINT sp;. 
2b3f0 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72     **       <shr
2b400 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c  ink database fil
2b410 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20  e to Y pages>.  
2b420 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72    **       pager
2b430 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20  Stress(page X). 
2b440 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41     **     ROLLBA
2b450 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a  CK TO sp;.    **
2b460 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29  .    ** If (X>Y)
2b470 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65  , then when page
2b480 72 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65  rStress is calle
2b490 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f  d page X will no
2b4a0 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20  t be written.   
2b4b0 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64   ** out to the d
2b4c0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75  atabase file, bu
2b4d0 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65  t will be droppe
2b4e0 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
2b4f0 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66  . Then,.    ** f
2b500 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f  ollowing the "RO
2b510 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74  LLBACK TO sp" st
2b520 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67  atement, reading
2b530 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61   page X will rea
2b540 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72  d.    ** data fr
2b550 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2b560 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  file. This will 
2b570 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70  be the copy of p
2b580 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 20 20  age X as it.    
2b590 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  ** was when the 
2b5a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
2b5b0 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77  ted, not as it w
2b5c0 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49  as when "SAVEPOI
2b5d0 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61  NT sp".    ** wa
2b5e0 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  s executed..    
2b5f0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
2b600 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69  lution is to wri
2b610 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  te the current d
2b620 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69  ata for page X i
2b630 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
2b640 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
2b650 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e   now (if it is n
2b660 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65  ot already there
2b670 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ), so that it wi
2b680 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73  ll.    ** be res
2b690 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72  tored to its cur
2b6a0 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20  rent value when 
2b6b0 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
2b6c0 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20   sp" is .    ** 
2b6d0 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f  executed..    */
2b6e0 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a  .    if( NEVER(.
2b6f0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
2b700 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67  TE_OK && pPg->pg
2b710 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no>pPager->dbSiz
2b720 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65  e && subjRequire
2b730 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 20 29  sPage(pPg).    )
2b740 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2b750 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
2b760 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  g);.    }.  .   
2b770 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
2b780 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2b790 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ge out to the da
2b7a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
2b7b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b7c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2b7d0 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
2b7e0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2b7f0 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
2b800 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
2b810 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72  _pagelist(pPager
2b820 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  , pPg);.    }.  
2b830 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
2b840 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
2b850 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2b860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
2b870 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
2b880 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
2b890 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2b8a0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2b8b0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
2b8c0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
2b8d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
2b8e0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
2b8f0 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a  , rc); .}.../*.*
2b900 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2b910 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
2b920 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
2b930 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
2b940 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
2b950 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
2b960 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
2b970 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
2b980 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
2b990 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
2b9a0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
2b9b0 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
2b9c0 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
2b9d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b9e0 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
2b9f0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
2ba00 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
2ba10 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
2ba20 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
2ba30 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
2ba40 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
2ba50 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
2ba60 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
2ba70 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
2ba80 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
2ba90 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
2baa0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
2bab0 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
2bac0 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
2bad0 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
2bae0 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
2baf0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
2bb00 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
2bb10 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
2bb20 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
2bb30 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
2bb40 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
2bb50 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
2bb60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2bb70 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
2bb80 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
2bb90 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
2bba0 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
2bbb0 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
2bbc0 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
2bbd0 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
2bbe0 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
2bbf0 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  PI..**.** The fl
2bc00 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
2bc10 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
2bc20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
2bc30 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
2bc40 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
2bc50 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
2bc60 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
2bc70 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
2bc80 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
2bc90 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  ER_* flags..**.*
2bca0 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
2bcb0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
2bcc0 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
2bcd0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2bce0 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
2bcf0 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
2bd00 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
2bd10 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
2bd20 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
2bd30 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2bd40 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
2bd50 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
2bd60 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
2bd70 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
2bd80 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2bd90 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
2bda0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
2bdb0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
2bdc0 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
2bdd0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
2bde0 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
2bdf0 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
2be00 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
2be10 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2be20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2be30 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
2be40 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
2be50 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
2be60 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
2be70 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
2be80 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
2be90 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
2bea0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2beb0 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
2bec0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2bed0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2bee0 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
2bef0 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
2bf00 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
2bf10 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
2bf20 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2bf30 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2bf40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2bf50 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
2bf60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2bf70 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2bf80 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
2bf90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2bfa0 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
2bfb0 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2bfc0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2bfd0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2bfe0 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
2bff0 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
2c000 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
2c010 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
2c020 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
2c030 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
2c040 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
2c050 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
2c060 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
2c070 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
2c080 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2c090 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
2c0a0 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
2c0b0 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
2c0c0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
2c0d0 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
2c0e0 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
2c0f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2c100 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2c110 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
2c120 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
2c130 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
2c140 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
2c150 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
2c160 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
2c170 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2c180 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2c190 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
2c1a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
2c1b0 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
2c1c0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2c1d0 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
2c1e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
2c1f0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
2c200 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2c210 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
2c220 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
2c230 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
2c240 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
2c250 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
2c260 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2c270 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
2c280 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c290 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
2c2a0 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
2c2b0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
2c2c0 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
2c2d0 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
2c2e0 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
2c2f0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70  urnal */.  int p
2c300 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
2c310 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
2c320 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2c330 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2c340 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20  PCache */.  u32 
2c350 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2c360 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2c370 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
2c380 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
2c390 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
2c3a0 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52  ri = 0;    /* UR
2c3b0 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a  I args to copy *
2c3c0 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30  /.  int nUri = 0
2c3d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2c3e0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2c3f0 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a  of URI args at *
2c400 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  zUri */..  /* Fi
2c410 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
2c420 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
2c430 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
2c440 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
2c450 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
2c460 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
2c470 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
2c480 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
2c490 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69  al). This.  ** i
2c4a0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  s the maximum sp
2c4b0 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
2c4c0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
2c4d0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2c4e0 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  e .  ** and a re
2c4f0 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
2c500 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20  le-handle. Note 
2c510 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20  that a "regular 
2c520 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a  journal-handle".
2c530 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72    ** may be a wr
2c540 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66  apper capable of
2c550 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72   caching the fir
2c560 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  st portion of th
2c570 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
2c580 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f  ile in memory to
2c590 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61   implement the a
2c5a0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2c5b0 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20  mization (see . 
2c5c0 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20   ** source file 
2c5d0 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f  journal.c)..  */
2c5e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
2c5f0 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
2c600 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
2c610 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
2c620 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2c630 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
2c640 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2c650 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c660 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2c670 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2c680 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
2c690 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
2c6a0 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
2c6b0 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
2c6c0 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
2c6d0 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
2c6e0 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65  ger = 0;..#ifnde
2c6f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
2c700 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61  MORYDB.  if( fla
2c710 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52  gs & PAGER_MEMOR
2c720 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d  Y ){.    memDb =
2c730 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c   1;.    if( zFil
2c740 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2c750 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a  me[0] ){.      z
2c760 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2c770 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46  e3DbStrDup(0, zF
2c780 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
2c790 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2c7a0 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54    ) return SQLIT
2c7b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6e  E_NOMEM;.      n
2c7c0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2c7d0 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2c7e0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69  name);.      zFi
2c7f0 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  lename = 0;.    
2c800 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2c810 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
2c820 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
2c830 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
2c840 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
2c850 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
2c860 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
2c870 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
2c880 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
2c890 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
2c8a0 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
2c8b0 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
2c8c0 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
2c8d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2c8e0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2c8f0 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e  me[0] ){.    con
2c900 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
2c910 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  nPathname = pVfs
2c920 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
2c930 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2c940 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
2c950 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a  aw(0, nPathname*
2c960 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  2);.    if( zPat
2c970 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  hname==0 ){.    
2c980 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c990 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
2c9a0 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
2c9b0 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
2c9c0 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
2c9d0 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
2c9e0 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
2c9f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
2ca00 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
2ca10 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
2ca20 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
2ca30 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  );.    nPathname
2ca40 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2ca50 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2ca60 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a     z = zUri = &z
2ca70 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33  Filename[sqlite3
2ca80 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
2ca90 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c  me)+1];.    whil
2caa0 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a  e( *z ){.      z
2cab0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
2cac0 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20  n30(z)+1;.      
2cad0 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2cae0 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d  en30(z)+1;.    }
2caf0 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74  .    nUri = (int
2cb00 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b  )(&z[1] - zUri);
2cb10 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55 72  .    assert( nUr
2cb20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
2cb30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2cb40 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
2cb50 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
2cb60 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
2cb70 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
2cb80 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2cb90 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
2cba0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
2cbb0 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
2cbc0 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
2cbd0 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
2cbe0 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
2cbf0 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
2cc00 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
2cc10 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
2cc20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
2cc30 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
2cc40 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
2cc50 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
2cc60 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
2cc70 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
2cc80 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2cc90 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
2cca0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ccb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2ccc0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
2ccd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2cce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ccf0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2cd00 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2cd10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2cd20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
2cd30 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
2cd40 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  r the Pager stru
2cd50 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62  cture, PCache ob
2cd60 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74  ject, the.  ** t
2cd70 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69  hree file descri
2cd80 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62  ptors, the datab
2cd90 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ase file name an
2cda0 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  d the journal . 
2cdb0 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54   ** file name. T
2cdc0 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d  he layout in mem
2cdd0 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ory is as follow
2cde0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
2cdf0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20   Pager object   
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce10 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20   (sizeof(Pager) 
2ce20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2ce30 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20  PCache object   
2ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce50 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69  (sqlite3PcacheSi
2ce60 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ze() bytes).  **
2ce70 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2ce80 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2ce90 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73       (pVfs->szOs
2cea0 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  File bytes).  **
2ceb0 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c       Sub-journal
2cec0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2ced0 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
2cee0 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
2cef0 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e  *     Main journ
2cf00 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2cf10 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2cf20 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2cf30 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2cf40 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2cf50 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
2cf60 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e+1 bytes).  ** 
2cf70 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
2cf80 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2cf90 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38      (nPathname+8
2cfa0 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20  +1 bytes).  */. 
2cfb0 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71   pPtr = (u8 *)sq
2cfc0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2cfd0 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65  .    ROUND8(size
2cfe0 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20  of(*pPager)) +  
2cff0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
2d000 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f  ucture */.    RO
2d010 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2d020 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
2d030 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
2d040 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73  .    ROUND8(pVfs
2d050 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20  ->szOsFile) +   
2d060 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
2d070 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
2d080 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
2d090 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a   2 +          /*
2d0a0 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c   The two journal
2d0b0 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e   files */ .    n
2d0c0 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2d0d0 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  Uri +         /*
2d0e0 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20   zFilename */.  
2d0f0 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20    nPathname + 8 
2d100 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20  + 2             
2d110 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a   /* zJournal */.
2d120 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d130 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50  MIT_WAL.    + nP
2d140 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20  athname + 4 + 2 
2d150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57             /* zW
2d160 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29  al */.#endif.  )
2d170 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2d180 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2d190 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50  (SQLITE_INT_TO_P
2d1a0 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  TR(journalFileSi
2d1b0 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70  ze)) );.  if( !p
2d1c0 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Ptr ){.    sqlit
2d1d0 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2d1e0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
2d1f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d200 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20  .  }.  pPager = 
2d210 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61               (Pa
2d220 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70  ger*)(pPtr);.  p
2d230 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d  Pager->pPCache =
2d240 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50      (PCache*)(pP
2d250 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a  tr += ROUND8(siz
2d260 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a  eof(*pPager)));.
2d270 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20    pPager->fd =  
2d280 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2d290 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2d2a0 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  pcacheSize));.  
2d2b0 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28  pPager->sjfd = (
2d2c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2d2d0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56  Ptr += ROUND8(pV
2d2e0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a  fs->szOsFile));.
2d2f0 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
2d300 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2d310 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2d320 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  FileSize);.  pPa
2d330 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
2d340 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72      (char*)(pPtr
2d350 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
2d360 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
2d370 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2d380 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64  MENT(pPager->jfd
2d390 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
2d3a0 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69  in the Pager.zFi
2d3b0 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72  lename and Pager
2d3c0 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72  .zJournal buffer
2d3d0 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  s, if required. 
2d3e0 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
2d3f0 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
2d400 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b  ( nPathname>0 );
2d410 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  .    pPager->zJo
2d420 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a  urnal =   (char*
2d430 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e  )(pPtr += nPathn
2d440 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b  ame + 1 + nUri);
2d450 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2d460 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
2d470 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2d480 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55  ame);.    if( nU
2d490 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61  ri ) memcpy(&pPa
2d4a0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
2d4b0 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72  Pathname+1], zUr
2d4c0 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65  i, nUri);.    me
2d4d0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
2d4e0 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  urnal, zPathname
2d4f0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2d500 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2d510 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68  ->zJournal[nPath
2d520 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  name], "-journal
2d530 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20  \000", 8+2);.   
2d540 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
2d550 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ix3(pPager->zFil
2d560 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a  ename, pPager->z
2d570 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65  Journal);.#ifnde
2d580 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2d590 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57  L.    pPager->zW
2d5a0 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a  al = &pPager->zJ
2d5b0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2d5c0 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  +8+1];.    memcp
2d5d0 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  y(pPager->zWal, 
2d5e0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2d5f0 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2d600 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b  y(&pPager->zWal[
2d610 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61  nPathname], "-wa
2d620 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20  l\000", 4+1);.  
2d630 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2d640 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2d650 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2d660 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  zWal);.#endif.  
2d670 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2d680 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2d690 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66   }.  pPager->pVf
2d6a0 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67  s = pVfs;.  pPag
2d6b0 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76  er->vfsFlags = v
2d6c0 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f  fsFlags;..  /* O
2d6d0 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  pen the pager fi
2d6e0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  le..  */.  if( z
2d6f0 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2d700 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2d710 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20  int fout = 0;   
2d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d730 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65   /* VFS flags re
2d740 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28  turned by xOpen(
2d750 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ) */.    rc = sq
2d760 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
2d770 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2d780 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ame, pPager->fd,
2d790 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74   vfsFlags, &fout
2d7a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2d7b0 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61  memDb );.    rea
2d7c0 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
2d7d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2d7e0 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  LY);..    /* If 
2d7f0 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
2d800 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
2d810 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
2d820 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
2d830 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
2d840 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
2d850 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
2d860 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
2d870 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
2d880 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2d890 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
2d8a0 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
2d8b0 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
2d8c0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2d8d0 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
2d8e0 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
2d8f0 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
2d900 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
2d910 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
2d920 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
2d930 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
2d940 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
2d950 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2d960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d970 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
2d980 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
2d990 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
2d9a0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
2d9b0 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b  if( !readOnly ){
2d9c0 0a 20 20 20 20 20 20 20 20 73 65 74 53 65 63 74  .        setSect
2d9d0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2d9e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2d9f0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2da00 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f  GE_SIZE<=SQLITE_
2da10 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2da20 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20  _SIZE);.        
2da30 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70  if( szPageDflt<p
2da40 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2da50 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
2da60 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
2da70 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  rSize>SQLITE_MAX
2da80 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2da90 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
2daa0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
2dab0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2dac0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
2dad0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2dae0 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2daf0 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67  Dflt = (u32)pPag
2db00 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  er->sectorSize;.
2db10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2db20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2db30 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2db40 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  C_WRITE.        
2db50 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2db60 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ii;.          as
2db70 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2db80 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
2db90 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
2dba0 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2dbb0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
2dbc0 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
2dbd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2dbe0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2dbf0 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35  T_PAGE_SIZE<=655
2dc00 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  36);.          f
2dc10 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74  or(ii=szPageDflt
2dc20 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  ; ii<=SQLITE_MAX
2dc30 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2dc40 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20  ZE; ii=ii*2){.  
2dc50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
2dc60 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
2dc70 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20  ATOMIC|(ii>>8)) 
2dc80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2dc90 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69   szPageDflt = ii
2dca0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2dcb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2dcc0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2dcd0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
2dce0 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69  r->noLock = sqli
2dcf0 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2dd00 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f  zFilename, "nolo
2dd10 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ck", 0);.      i
2dd20 66 28 20 28 69 44 63 20 26 20 53 51 4c 49 54 45  f( (iDc & SQLITE
2dd30 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45  _IOCAP_IMMUTABLE
2dd40 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73  )!=0.       || s
2dd50 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
2dd60 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69  an(zFilename, "i
2dd70 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b  mmutable", 0) ){
2dd80 0a 20 20 20 20 20 20 20 20 20 20 76 66 73 46 6c  .          vfsFl
2dd90 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
2dda0 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
2ddb0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f         goto act_
2ddc0 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a  like_temp_file;.
2ddd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2dde0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
2ddf0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2de00 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
2de10 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
2de20 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2de30 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2de40 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
2de50 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2de60 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
2de70 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
2de80 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
2de90 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
2dea0 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
2deb0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2dec0 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73  is branch is als
2ded0 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d  o run for an in-
2dee0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2def0 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20   An in-memory.  
2df00 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2df10 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74   the same as a t
2df20 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73  emp-file that is
2df30 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f   never written o
2df40 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73  ut to.    ** dis
2df50 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e  k and uses an in
2df60 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b  -memory rollback
2df70 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a   journal..    **
2df80 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
2df90 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f  nch also runs fo
2dfa0 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61  r files marked a
2dfb0 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20  s immutable..   
2dfc0 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65   */ .act_like_te
2dfd0 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d  mp_file:.    tem
2dfe0 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
2dff0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2e000 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20  PAGER_READER;   
2e010 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20    /* Pretend we 
2e020 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
2e030 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ock */.    pPage
2e040 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55  r->eLock = EXCLU
2e050 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a  SIVE_LOCK;    /*
2e060 20 50 72 65 74 65 6e 64 20 77 65 20 61 72 65 20   Pretend we are 
2e070 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  in EXCLUSIVE loc
2e080 6b 69 6e 67 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  king mode */.   
2e090 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
2e0a0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2e0b0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63      /* Do no loc
2e0c0 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64  king */.    read
2e0d0 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73  Only = (vfsFlags
2e0e0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
2e0f0 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f  DONLY);.  }..  /
2e100 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2e110 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74  call to PagerSet
2e120 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65  Pagesize() serve
2e130 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c  s to set the val
2e140 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65  ue of .  ** Page
2e150 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74  r.pageSize and t
2e160 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50  o allocate the P
2e170 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
2e180 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  uffer..  */.  if
2e190 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e1a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2e1b0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
2e1c0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2e1d0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
2e1e0 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50  ize(pPager, &szP
2e1f0 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20  ageDflt, -1);.  
2e200 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
2e210 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
2e220 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
2e230 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a  e the PCache obj
2e240 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ect. */.  if( rc
2e250 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e260 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
2e270 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 6e 45  a<1000 );.    nE
2e280 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45  xtra = ROUND8(nE
2e290 78 74 72 61 29 3b 0a 20 20 20 20 72 63 20 3d 20  xtra);.    rc = 
2e2a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
2e2b0 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
2e2c0 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20  xtra, !memDb,.  
2e2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2e0 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f           !memDb?
2e2f0 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28  pagerStress:0, (
2e300 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
2e310 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2e320 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
2e330 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2e340 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
2e350 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2e360 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
2e370 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2e380 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e390 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
2e3a0 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
2e3b0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2e3c0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
2e3d0 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c  pSpace);.    sql
2e3e0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
2e3f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2e400 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
2e410 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
2e420 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
2e430 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
2e440 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e450 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
2e460 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
2e470 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
2e480 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
2e490 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2e4a0 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
2e4b0 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  l;.  /* pPager->
2e4c0 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
2e4d0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2e4e0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
2e4f0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
2e500 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  f = 0; */.  /* p
2e510 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
2e520 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e530 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
2e540 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e550 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
2e560 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
2e570 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
2e580 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
2e590 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2e5a0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
2e5b0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  /.  /* pPager->e
2e5c0 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
2e5d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e5e0 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2e5f0 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
2e600 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2e610 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
2e620 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
2e630 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2e640 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2e650 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
2e660 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2e670 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
2e680 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
2e690 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
2e6a0 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
2e6b0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2e6c0 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
2e6d0 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
2e6e0 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
2e6f0 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
2e700 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
2e710 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72  eadOnly;.  asser
2e720 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  t( useJournal ||
2e730 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e740 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  e );.  pPager->n
2e750 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
2e760 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
2e770 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
2e780 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2e790 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d  ager->fullSync==
2e7a0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2e7b0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2e7c0 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
2e7d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c  ert( pPager->wal
2e7e0 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  SyncFlags==0 );.
2e7f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e800 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
2e810 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  s==0 );.  }else{
2e820 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
2e830 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  lSync = 1;.    p
2e840 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2e850 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2e860 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
2e870 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
2e880 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2e890 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f  RMAL | WAL_SYNC_
2e8a0 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20  TRANSACTIONS;.  
2e8b0 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
2e8c0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2e8d0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2e8e0 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
2e8f0 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
2e900 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2e910 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
2e920 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
2e930 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
2e940 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75  ger->nExtra = (u
2e950 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61  16)nExtra;.  pPa
2e960 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
2e970 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
2e980 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
2e990 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
2e9a0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2e9b0 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46  er->fd) || tempF
2e9c0 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74  ile );.  setSect
2e9d0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2e9e0 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61    if( !useJourna
2e9f0 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  l ){.    pPager-
2ea00 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2ea10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ea20 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _OFF;.  }else if
2ea30 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ( memDb ){.    p
2ea40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2ea50 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2ea60 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20  ALMODE_MEMORY;. 
2ea70 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2ea80 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  xBusyHandler = 0
2ea90 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2eaa0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
2eab0 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  g = 0; */.  pPag
2eac0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
2ead0 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65  xReinit;.  /* me
2eae0 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
2eaf0 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
2eb00 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
2eb10 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2eb20 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  zMmap = SQLITE_D
2eb30 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45  EFAULT_MMAP_SIZE
2eb40 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20   // will be set 
2eb50 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20  by btree.c */.. 
2eb60 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
2eb70 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
2eb80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56  ITE_OK;.}.../* V
2eb90 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
2eba0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
2ebb0 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64 20   not be deleted 
2ebc0 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20 66  or renamed out f
2ebd0 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65  rom.** under the
2ebe0 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
2ebf0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
2ec00 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 69   database is sti
2ec10 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68 74  ll were it ought
2ec20 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69 73  .** to be on dis
2ec30 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  k.  Return non-z
2ec40 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41 44  ero (SQLITE_READ
2ec50 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20  ONLY_DBMOVED or 
2ec60 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
2ec70 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73 71  .** code from sq
2ec80 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 29  lite3OsAccess())
2ec90 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2eca0 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e   has gone missin
2ecb0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
2ecc0 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76   databaseIsUnmov
2ecd0 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
2ece0 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f 76  ){.  int bHasMov
2ecf0 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ed = 0;.  int rc
2ed00 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
2ed10 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74 75  >tempFile ) retu
2ed20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ed30 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
2ed40 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ze==0 ) return S
2ed50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
2ed60 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  rt( pPager->zFil
2ed70 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72 2d  ename && pPager-
2ed80 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b  >zFilename[0] );
2ed90 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
2eda0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
2edb0 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
2edc0 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c  FCNTL_HAS_MOVED,
2edd0 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20   &bHasMoved);.  
2ede0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
2edf0 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f  OTFOUND ){.    /
2ee00 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f 56  * If the HAS_MOV
2ee10 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
2ee20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64  is unimplemented
2ee30 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
2ee40 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61  e file.    ** ha
2ee50 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64  s not been moved
2ee60 2e 20 20 54 68 61 74 20 69 73 20 74 68 65 20 68  .  That is the h
2ee70 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76 69  istorical behavi
2ee80 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70 72  or of SQLite: pr
2ee90 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65  ior to.    ** ve
2eea0 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20  rsion 3.8.3, it 
2eeb0 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a 2f  never checked */
2eec0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2eed0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
2eee0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2eef0 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20  & bHasMoved ){. 
2ef00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
2ef10 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b  EADONLY_DBMOVED;
2ef20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2ef30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
2ef40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2ef50 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69  led after transi
2ef60 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47  tioning from PAG
2ef70 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20  ER_UNLOCK to.** 
2ef80 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
2ef90 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20  te. It tests if 
2efa0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
2efb0 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69  ournal present i
2efc0 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  n.** the file-sy
2efd0 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76  stem for the giv
2efe0 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20  en pager. A hot 
2eff0 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
2f000 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  hat .** needs to
2f010 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
2f020 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   According to th
2f030 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68  is function, a h
2f040 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
2f050 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65  le exists if the
2f060 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
2f070 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
2f080 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
2f090 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
2f0a0 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
2f0b0 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
2f0c0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2f0d0 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2f0e0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2f0f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2f100 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
2f110 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
2f120 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
2f130 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
2f140 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ize, and.**   * 
2f150 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
2f160 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2f170 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
2f180 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a   not 0x00..**.**
2f190 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
2f1a0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2f1b0 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
2f1c0 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
2f1d0 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
2f1e0 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
2f1f0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
2f200 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
2f210 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
2f220 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
2f230 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
2f240 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f250 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c  e is.** just del
2f260 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c  eted using OsDel
2f270 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ete, *pExists is
2f280 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
2f290 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2f2a0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
2f2b0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
2f2c0 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65  not check if the
2f2d0 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a  re is a master j
2f2e0 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
2f2f0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
2f300 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2f310 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74  ere is, and that
2f320 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2f330 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  file.** does not
2f340 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65   exist, then the
2f350 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2f360 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e   not really hot.
2f370 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
2f380 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
2f390 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73  ll return a fals
2f3a0 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20  e-positive. The 
2f3b0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
2f3c0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  .** routine will
2f3d0 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
2f3e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f3f0 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2f400 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e  t and .** will n
2f410 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ot roll it back.
2f420 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74   .**.** If a hot
2f430 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2f440 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c   found to exist,
2f450 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2f460 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51   to 1 and .** SQ
2f470 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2f480 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72  . If no hot-jour
2f490 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
2f4a0 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ent, *pExists is
2f4b0 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64  .** set to 0 and
2f4c0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2f4d0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2f4e0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2f4f0 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65   trying.** to de
2f500 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
2f510 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75  or not a hot-jou
2f520 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2f530 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a  , the IO error.*
2f540 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
2f550 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2f560 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20   of *pExists is 
2f570 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
2f580 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
2f590 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
2f5a0 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
2f5b0 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
2f5c0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
2f5d0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
2f5e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2f5f0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2f600 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2f610 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  /.  int exists =
2f620 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2f630 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a    /* True if a j
2f640 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
2f650 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
2f660 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f  jrnlOpen = !!isO
2f670 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2f680 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
2f690 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2f6a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
2f6b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2f6c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2f6d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2f6e0 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73  ER_OPEN );..  as
2f6f0 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
2f700 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
2f710 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2f720 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
2f730 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
2f740 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
2f750 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
2f760 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
2f770 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
2f780 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
2f790 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
2f7a0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2f7b0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2f7c0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
2f7d0 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
2f7e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f7f0 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
2f800 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20  int locked = 0; 
2f810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f820 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
2f830 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
2f840 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
2f850 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
2f860 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
2f870 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
2f880 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
2f890 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
2f8a0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
2f8b0 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
2f8c0 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
2f8d0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
2f8e0 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
2f8f0 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
2f900 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2f910 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
2f920 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
2f930 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
2f940 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
2f950 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
2f960 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
2f970 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
2f980 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
2f990 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
2f9a0 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
2f9b0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
2f9c0 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
2f9d0 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
2f9e0 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
2f9f0 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
2fa00 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
2fa10 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
2fa20 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
2fa30 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
2fa40 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
2fa50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
2fa60 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2fa70 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
2fa80 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
2fa90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2faa0 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
2fab0 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
2fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fad0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2fae0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2faf0 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   */..      rc = 
2fb00 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
2fb10 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
2fb20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2fb30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fb40 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
2fb50 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20 70 61  abase is zero pa
2fb60 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 61  ges in size, tha
2fb70 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74  t means that eit
2fb80 68 65 72 20 28 31 29 20 74 68 65 0a 20 20 20 20  her (1) the.    
2fb90 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69      ** journal i
2fba0 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d  s a remnant from
2fbb0 20 61 20 70 72 69 6f 72 20 64 61 74 61 62 61 73   a prior databas
2fbc0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
2fbd0 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20 20 20  name where.     
2fbe0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
2fbf0 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f 74 20  se file but not 
2fc00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
2fc10 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32 29 20  deleted, or (2) 
2fc20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20 20 20  the initial.    
2fc30 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
2fc40 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61 74 65  on that populate
2fc50 73 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  s a new database
2fc60 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
2fc70 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   back..        *
2fc80 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
2fc90 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
2fca0 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  le can be delete
2fcb0 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 61 6b  d.  However, tak
2fcc0 65 20 63 61 72 65 0a 20 20 20 20 20 20 20 20 2a  e care.        *
2fcd0 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74 65 20  * not to delete 
2fce0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2fcf0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
2fd00 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a 20 20  y open due to.  
2fd10 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
2fd20 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a 20  _mode=PERSIST.. 
2fd30 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2fd40 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26    if( nPage==0 &
2fd50 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  & !jrnlOpen ){. 
2fd60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2fd70 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
2fd80 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  c();.          i
2fd90 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70  f( pagerLockDb(p
2fda0 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
2fdb0 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)==SQLITE_OK
2fdc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fdd0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
2fde0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2fdf0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
2fe00 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2fe10 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2fe20 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b  de ) pagerUnlock
2fe30 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
2fe40 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
2fe50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2fe60 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
2fe70 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
2fe80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fe90 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
2fea0 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
2feb0 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
2fec0 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72  tion has a reser
2fed0 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ved.          **
2fee0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2fef0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2ff00 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b   file. Now check
2ff10 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20   that there is. 
2ff20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c           ** at l
2ff30 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72  east one non-zer
2ff40 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73  o bytes at the s
2ff50 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
2ff60 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
2ff70 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
2ff80 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73  is, then we cons
2ff90 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61  ider this journa
2ffa0 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20  l to be hot. If 
2ffb0 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  not, .          
2ffc0 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e  ** it can be ign
2ffd0 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  ored..          
2ffe0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2fff0 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
30000 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
30010 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
30020 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
30030 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
30040 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30050 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
30060 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
30070 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
30080 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20  jfd, f, &f);.   
30090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
300a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
300b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
300c0 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30      u8 first = 0
300d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
300e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
300f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76  (pPager->jfd, (v
30100 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c  oid *)&first, 1,
30110 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
30120 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30130 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
30140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30150 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
30160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
30170 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30180 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
30190 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
301a0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
301b0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
301c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
301d0 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69    *pExists = (fi
301e0 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  rst!=0);.       
301f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
30200 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
30210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30220 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  /* If we cannot 
30230 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  open the rollbac
30240 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  k journal file i
30250 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69  n order to see i
30260 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  f.            **
30270 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f 20 68   it has a zero h
30280 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68  eader, that migh
30290 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49  t be due to an I
302a0 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20  /O error, or.   
302b0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d           ** it m
302c0 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74  ight be due to t
302d0 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  he race conditio
302e0 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  n described abov
302f0 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20  e and in.       
30300 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23       ** ticket #
30310 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61  3883.  Either wa
30320 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  y, assume that t
30330 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
30340 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
30350 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20  * This might be 
30360 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
30370 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c  .  But if it is,
30380 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20   then the.      
30390 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74        ** automat
303a0 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62  ic journal playb
303b0 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79  ack and recovery
303c0 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20   mechanism will 
303d0 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20  deal.           
303e0 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65   ** with it unde
303f0 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  r an EXCLUSIVE l
30400 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20  ock where we do 
30410 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  not need to.    
30420 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79          ** worry
30430 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61   so much with ra
30440 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20  ce conditions.. 
30450 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
30460 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
30470 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ts = 1;.        
30480 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30490 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
304a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
304b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
304c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
304d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
304e0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
304f0 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
30500 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
30510 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69  se file..** It i
30520 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  s illegal to cal
30530 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  l sqlite3PagerAc
30540 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66  quire() until af
30550 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
30560 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
30570 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
30580 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
30590 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
305a0 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
305b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
305c0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
305d0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
305e0 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
305f0 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
30600 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
30610 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
30620 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
30630 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
30640 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
30650 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
30660 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
30670 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
30680 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
30690 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
306a0 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
306b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
306c0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
306d0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
306e0 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
306f0 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
30700 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
30710 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
30720 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
30730 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
30740 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
30750 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
30760 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
30770 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
30780 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
30790 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
307a0 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
307b0 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
307c0 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
307d0 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
307e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
307f0 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
30800 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
30810 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
30820 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
30830 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
30840 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
30850 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
30860 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
30870 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
30880 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
30890 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
308a0 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
308b0 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
308c0 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
308d0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
308e0 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
308f0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
30900 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
30910 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
30920 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
30930 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
30940 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
30950 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
30960 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
30970 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
30980 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
30990 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
309a0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
309b0 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  ** occurs while 
309c0 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61  locking the data
309d0 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66  base, checking f
309e0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
309f0 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c   file or .** rol
30a00 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
30a10 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
30a20 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
30a30 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
30a40 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
30a50 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
30a60 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
30a70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
30a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
30a90 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
30aa0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
30ab0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
30ac0 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20  from b-tree and 
30ad0 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20  only when there 
30ae0 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73  are no.  ** outs
30af0 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54  tanding pages. T
30b00 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74  his implies that
30b10 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65   the pager state
30b20 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20   should either. 
30b30 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52   ** be OPEN or R
30b40 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73  EADER. READER is
30b50 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
30b60 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
30b70 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65  r was in .  ** e
30b80 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
30b90 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mode..  */.  ass
30ba0 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
30bb0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
30bc0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
30bd0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
30be0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
30bf0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
30c00 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
30c10 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
30c20 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
30c30 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
30c40 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45  ;.  if( NEVER(ME
30c50 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
30c60 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72  rrCode) ){ retur
30c70 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
30c80 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67  e; }..  if( !pag
30c90 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
30ca0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
30cb0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
30cc0 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f  {.    int bHotJo
30cd0 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20  urnal = 1;      
30ce0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
30cf0 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f  here exists a ho
30d00 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a  t journal-file *
30d10 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
30d20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72 63  MEMDB );..    rc
30d30 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
30d40 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
30d50 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
30d60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30d70 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
30d80 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
30d90 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61  ==NO_LOCK || pPa
30da0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
30db0 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
30dc0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
30dd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
30de0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
30df0 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
30e00 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
30e10 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
30e20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
30e30 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
30e40 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
30e50 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
30e60 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
30e70 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
30e80 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
30e90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  {.      rc = has
30ea0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
30eb0 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29  r, &bHotJournal)
30ec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30ed0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30ee0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
30ef0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
30f00 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( bHotJournal ){
30f10 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
30f20 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
30f30 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30f40 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
30f50 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f  BACK;.        go
30f60 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
30f70 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74   }..      /* Get
30f80 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
30f90 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
30fa0 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
30fb0 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
30fc0 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20     ** important 
30fd0 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20  that a RESERVED 
30fe0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61  lock is not obta
30ff0 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20  ined on the way 
31000 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
31010 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
31020 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
31030 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
31040 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
31050 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
31060 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
31070 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
31080 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
31090 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
310a0 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
310b0 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
310c0 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
310d0 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20   rolling the .  
310e0 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
310f0 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  al back..      *
31100 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61  * .      ** Beca
31110 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
31120 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
31130 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
31140 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a  ted, any.      *
31150 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  * other process 
31160 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63  attempting to ac
31170 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
31180 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20  e file will get 
31190 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  to .      ** thi
311a0 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  s point in the c
311b0 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20  ode and fail to 
311c0 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45  obtain its own E
311d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20  XCLUSIVE lock . 
311e0 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
311f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
31200 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
31210 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  Unless the pager
31220 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d   is in locking_m
31230 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
31240 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a  de, the lock is.
31250 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61        ** downgra
31260 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f  ded to SHARED_LO
31270 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  CK before this f
31280 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
31290 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
312a0 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
312b0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
312c0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
312d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
312e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
312f0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
31300 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  }. .      /* If 
31310 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
31320 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66  y open and the f
31330 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ile exists on di
31340 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20  sk, open the .  
31350 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
31360 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
31370 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63 65  cess. Write acce
31380 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ss is required b
31390 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a  ecause .      **
313a0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
313b0 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
313c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
313d0 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
313e0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f  .      ** and po
313f0 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
31400 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
31410 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72  ter on. Also, wr
31420 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20  ite-access .    
31430 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20    ** is usually 
31440 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61  required to fina
31450 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
31460 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   in journal_mode
31470 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20 20  =persist .      
31480 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73  ** mode (and als
31490 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  o for journal_mo
314a0 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73  de=truncate on s
314b0 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20  ome systems)..  
314c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
314d0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64  If the journal d
314e0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69  oes not exist, i
314f0 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20  t usually means 
31500 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20  that some .     
31510 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
31520 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20  tion managed to 
31530 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20  get in and roll 
31540 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a  it back before .
31550 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
31560 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65  nnection obtaine
31570 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  d the exclusive 
31580 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20  lock above. Or, 
31590 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  it .      ** may
315a0 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70   mean that the p
315b0 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20  ager was in the 
315c0 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
315d0 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
315e0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
315f0 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  ed and the journ
31600 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
31610 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f   exist..      */
31620 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70  .      if( !isOp
31630 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
31640 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
31650 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
31660 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
31670 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  fs;.        int 
31680 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20 20  bExists;        
31690 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
316a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
316b0 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ists */.        
316c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
316d0 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20  cess(.          
316e0 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
316f0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
31700 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
31710 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20  &bExists);.     
31720 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31730 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20  E_OK && bExists 
31740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
31750 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   fout = 0;.     
31760 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
31770 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
31780 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
31790 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
317a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
317b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
317c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
317d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
317e0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
317f0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
31800 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
31810 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
31820 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
31830 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
31840 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20  r->jfd) );.     
31850 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31860 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
31870 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
31880 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
31890 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
318a0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
318b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
318c0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
318d0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
318e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
318f0 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
31900 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
31910 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
31920 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
31930 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
31940 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
31950 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
31960 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63  ock. Purge the c
31970 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20  ache before.    
31980 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63    ** playing bac
31990 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  k the hot-journa
319a0 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e  l so that we don
319b0 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20  't end up with. 
319c0 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e       ** an incon
319d0 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20  sistent cache.  
319e0 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75  Sync the hot jou
319f0 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
31a00 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  ing.      ** it 
31a10 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70  back since the p
31a20 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73  rocess that cras
31a30 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65  hed and left the
31a40 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot journal.   
31a50 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64     ** probably d
31a60 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61  id not sync it a
31a70 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72  nd we are requir
31a80 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e  ed to always syn
31a90 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a  c.      ** the j
31aa0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
31ab0 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20  aying it back.. 
31ac0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
31ad0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
31ae0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
31af0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
31b00 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
31b10 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63    rc = pagerSync
31b20 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
31b30 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
31b40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31b50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31b60 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
31b70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
31b80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
31b90 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
31ba0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31bb0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
31bc0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
31bd0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  de ){.        pa
31be0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
31bf0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
31c00 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
31c10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31c20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
31c30 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
31c40 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f  taken if an erro
31c50 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
31c60 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20  rying to open.  
31c70 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c        ** or roll
31c80 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
31c90 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  nal while holdin
31ca0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
31cb0 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20  ock. The.       
31cc0 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   ** pager_unlock
31cd0 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
31ce0 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
31cf0 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e   returning to un
31d00 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  lock.        ** 
31d10 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
31d20 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20   unlock attempt 
31d30 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65  fails, then Page
31d40 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a  r.eLock must be.
31d50 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
31d60 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28  o UNKNOWN_LOCK (
31d70 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
31d80 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
31d90 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a  e for .        *
31da0 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61  * UNKNOWN_LOCK a
31db0 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c  bove for an expl
31dc0 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20  anation). .     
31dd0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
31de0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   In order to get
31df0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
31e00 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20  to do this, set 
31e10 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a  Pager.eState to.
31e20 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52          ** PAGER
31e30 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73  _ERROR now. This
31e40 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
31e50 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72   counted as a tr
31e60 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20  ansition.       
31e70 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61   ** to ERROR sta
31e80 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20  te in the state 
31e90 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74  diagram at the t
31ea0 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c  op of this file,
31eb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63  .        ** sinc
31ec0 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  e we know that t
31ed0 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20  he same call to 
31ee0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
31ef0 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20  ill very.       
31f00 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e   ** shortly tran
31f10 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72  sition the pager
31f20 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f   object to the O
31f30 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69  PEN state. Calli
31f40 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ng.        ** as
31f50 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
31f60 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f  () would fail no
31f70 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20  w, as it should 
31f80 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
31f90 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
31fa0 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
31fb0 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a  when there are z
31fc0 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ero outstanding 
31fd0 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  page .        **
31fe0 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20   references..   
31ff0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32000 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
32010 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
32020 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
32030 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
32040 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
32050 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
32060 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
32070 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
32080 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
32090 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61           || (pPa
320a0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
320b0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  de && pPager->eL
320c0 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
320d0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
320e0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
320f0 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 28 0a  ->tempFile && (.
32100 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
32110 70 42 61 63 6b 75 70 20 0a 20 20 20 20 20 7c 7c  pBackup .     ||
32120 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
32130 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
32140 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20  pPCache)>0 .    
32150 20 7c 7c 20 55 53 45 46 45 54 43 48 28 70 50 61   || USEFETCH(pPa
32160 67 65 72 29 0a 20 20 20 20 29 29 7b 0a 20 20 20  ger).    )){.   
32170 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
32180 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62  -lock has just b
32190 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20  een acquired on 
321a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
321b0 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74  e.      ** and t
321c0 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79  here are already
321d0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
321e0 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76  che (from a prev
321f0 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65  ious.      ** re
32200 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
32210 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b  saction).  Check
32220 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64   to see if the d
32230 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
32240 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
32250 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ed.  If the data
32260 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64  base has changed
32270 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20  , flush the.    
32280 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20    ** cache..    
32290 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61    **.      ** Da
322a0 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69  tabase changes i
322b0 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  s detected by lo
322c0 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
322d0 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
322e0 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
322f0 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
32300 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
32310 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
32320 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33  are.      ** a 3
32330 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68  2-bit counter th
32340 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  at is incremente
32350 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e  d with each chan
32360 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  ge.  The.      *
32370 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
32380 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
32390 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
323a0 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  nge when.      *
323b0 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
323c0 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  use..      ** . 
323d0 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
323e0 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
323f0 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
32400 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
32410 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20  ot be .      ** 
32420 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
32430 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
32440 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
32450 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
32460 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
32470 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
32480 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f     */.      Pgno
32490 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20   nPage = 0;.    
324a0 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
324b0 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
324c0 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a  >dbFileVers)];..
324d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
324e0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
324f0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
32500 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
32510 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66  ailed;..      if
32520 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
32530 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
32540 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20  KVERS %p %d\n", 
32550 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64  pPager, sizeof(d
32560 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20  bFileVers)));.  
32570 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32580 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
32590 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
325a0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
325b0 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
325c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
325d0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
325e0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
325f0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
32600 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
32610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
32620 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
32630 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
32640 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
32650 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
32660 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
32670 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
32680 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
32690 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
326a0 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
326b0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
326c0 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
326d0 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64    /* Unmap the d
326e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
326f0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
32700 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65  t external proce
32710 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  sses.        ** 
32720 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74  may have truncat
32730 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
32740 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78  file and then ex
32750 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20  tended it back. 
32760 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73         ** to its
32770 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77   original size w
32780 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
32790 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e  s was not holdin
327a0 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  g a lock..      
327b0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
327c0 65 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73  e there may exis
327d0 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d  t a Pager.pMap m
327e0 61 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65  apping that appe
327f0 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ars.        ** t
32800 6f 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73  o be the right s
32810 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61  ize but is not a
32820 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41  ctually valid. A
32830 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20  void this.      
32840 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79    ** possibility
32850 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68   by unmapping th
32860 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20  e db here. */.  
32870 20 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54        if( USEFET
32880 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  CH(pPager) ){.  
32890 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
328a0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
328b0 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >fd, 0, 0);.    
328c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
328d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
328e0 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69  here is a WAL fi
328f0 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
32900 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73  ystem, open this
32910 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c   database in WAL
32920 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74  .    ** mode. Ot
32930 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c  herwise, the fol
32940 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lowing function 
32950 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
32960 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
32970 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
32980 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a  resent(pPager);.
32990 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
329a0 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65  MIT_WAL.    asse
329b0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
329c0 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
329d0 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20  E_OK );.#endif. 
329e0 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
329f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
32a00 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
32a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
32a20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
32a30 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
32a40 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
32a50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
32a60 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
32a70 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
32a80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
32a90 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
32aa0 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53  er, &pPager->dbS
32ab0 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c  ize);.  }.. fail
32ac0 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
32ad0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
32ae0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
32af0 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
32b00 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  k(pPager);.    a
32b10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
32b20 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
32b30 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  N );.  }else{.  
32b40 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
32b50 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
32b60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
32b70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
32b80 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
32b90 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
32ba0 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
32bb0 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
32bc0 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
32bd0 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
32be0 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
32bf0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
32c00 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
32c10 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
32c20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
32c30 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
32c40 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
32c50 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
32c60 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
32c70 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
32c80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
32c90 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
32ca0 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
32cb0 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
32cc0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
32cd0 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
32ce0 74 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65 33  t==0 && (sqlite3
32cf0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
32d00 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
32d10 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72  =0) ){.    pager
32d20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
32d30 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  k(pPager);.  }.}
32d40 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
32d50 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
32d60 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  age number pgno 
32d70 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20  in pager pPager 
32d80 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72  (a page.** refer
32d90 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62  ence has type Db
32da0 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72  Page*). If the r
32db0 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
32dc0 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
32dd0 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
32de0 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
32df0 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
32e00 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
32e10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
32e20 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
32e30 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
32e40 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75  ache, it is retu
32e50 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
32e60 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20  ise, a new page 
32e70 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
32e80 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
32e90 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72  d with data.** r
32ea0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
32eb0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73  abase file. In s
32ec0 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70  ome cases, the p
32ed0 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79  cache module may
32ee0 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74  .** choose not t
32ef0 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
32f00 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64   page object and
32f10 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78   may reuse an ex
32f20 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74  isting.** object
32f30 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e   with no outstan
32f40 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
32f50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61  .**.** The extra
32f60 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
32f70 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
32f80 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ys initialized t
32f90 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20  o zeros the .** 
32fa0 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
32fb0 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
32fc0 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20   memory. If the 
32fd0 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69  page requested i
32fe0 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  s .** already in
32ff0 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
33000 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
33010 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
33020 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20  e extra.** data 
33030 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61  is left as it wa
33040 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  s when the page 
33050 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20  object was last 
33060 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
33070 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
33080 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
33090 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
330a0 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a  page or if a .**
330b0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
330c0 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
330d0 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d   noContent param
330e0 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a  eter and the .**
330f0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
33100 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73  is not already s
33110 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63  tored in the cac
33120 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20  he, then no .** 
33130 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64  actual disk read
33140 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73   occurs. In this
33150 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79   case the memory
33160 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a   image of the .*
33170 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  * page is initia
33180 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72  lized to all zer
33190 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  os. .**.** If no
331a0 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
331b0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
331c0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
331d0 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
331e0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e  .** of the page.
331f0 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20   This occurs in 
33200 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  two scenarios:.*
33210 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72  *.**   a) When r
33220 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69  eading a free-li
33230 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  st leaf page fro
33240 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
33250 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57  and.**.**   b) W
33260 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
33270 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
33280 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64  back and we need
33290 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   to load.**     
332a0 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f   a new page into
332b0 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65   the cache to be
332c0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
332d0 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20   data read.**   
332e0 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65     from the save
332f0 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  point journal..*
33300 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
33310 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
33320 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
33330 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
33340 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20  ead of.** being 
33350 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
33360 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
33370 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
33380 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
33390 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
333a0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
333b0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
333c0 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
333d0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
333e0 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
333f0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
33400 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
33410 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
33420 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
33430 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
33440 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
33450 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
33460 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
33470 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
33480 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
33490 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
334a0 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
334b0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
334c0 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
334d0 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
334e0 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
334f0 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
33500 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
33510 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
33520 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
33530 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
33540 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
33550 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
33560 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
33570 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
33580 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
33590 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
335a0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
335b0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
335c0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
335d0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
335e0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
335f0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
33600 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
33610 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
33620 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
33630 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
33640 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
33650 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
33660 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
33670 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
33680 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
33690 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
336a0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
336b0 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
336c0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
336d0 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
336e0 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
336f0 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
33700 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
33710 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
33720 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
33730 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
33740 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
33750 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
33760 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
33770 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
33780 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
33790 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
337a0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
337b0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
337c0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
337d0 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
337e0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
337f0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
33800 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
33810 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
33820 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lags */.){.  int
33830 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33840 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
33850 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20  0;.  u32 iFrame 
33860 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
33870 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f       /* Frame to
33880 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66   read from WAL f
33890 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ile */.  const i
338a0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  nt noContent = (
338b0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
338c0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20  T_NOCONTENT);.. 
338d0 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74   /* It is accept
338e0 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65  able to use a re
338f0 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70  ad-only (mmap) p
33900 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65  age for any page
33910 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67   except.  ** pag
33920 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20  e 1 if there is 
33930 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
33940 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65  tion open or the
33950 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c   ACQUIRE_READONL
33960 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20  Y.  ** flag was 
33970 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
33980 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20   caller. And so 
33990 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69  long as the db i
339a0 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65  s not a .  ** te
339b0 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
339c0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20  mory database.  
339d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62  */.  const int b
339e0 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d  MmapOk = (pgno!=
339f0 31 20 26 26 20 55 53 45 46 45 54 43 48 28 70 50  1 && USEFETCH(pP
33a00 61 67 65 72 29 0a 20 20 20 26 26 20 28 70 50 61  ager).   && (pPa
33a10 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33a20 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c  ER_READER || (fl
33a30 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f  ags & PAGER_GET_
33a40 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65  READONLY)).#ifde
33a50 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
33a60 45 43 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d  EC.   && pPager-
33a70 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69  >xCodec==0.#endi
33a80 66 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  f.  );..  assert
33a90 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33aa0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
33ab0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
33ac0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
33ad0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
33ae0 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30  rt( noContent==0
33af0 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29   || bMmapOk==0 )
33b00 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  ;..  if( pgno==0
33b10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
33b20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
33b30 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
33b40 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
33b50 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
33b60 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
33b70 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a  r immediately. .
33b80 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
33b90 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65  request the page
33ba0 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65   from the PCache
33bb0 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28   layer. */.  if(
33bc0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
33bd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33be0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
33bf0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
33c00 7b 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f  {.    if( bMmapO
33c10 6b 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  k && pagerUseWal
33c20 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
33c30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
33c40 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
33c50 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
33c60 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
33c70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33c80 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
33c90 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
33ca0 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f  ..    if( bMmapO
33cb0 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d 30 20 29  k && iFrame==0 )
33cc0 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
33cd0 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  ata = 0;..      
33ce0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65  rc = sqlite3OsFe
33cf0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
33d00 0a 20 20 20 20 20 20 20 20 20 20 28 69 36 34 29  .          (i64)
33d10 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
33d20 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
33d30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26  ger->pageSize, &
33d40 70 44 61 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a  pData.      );..
33d50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33d60 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61  LITE_OK && pData
33d70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
33d80 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
33d90 41 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a 20  AGER_READER ){. 
33da0 20 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 73           pPg = s
33db0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
33dc0 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
33dd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33de0 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
33df0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
33e00 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
33e10 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  age(pPager, pgno
33e20 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a  , pData, &pPg);.
33e30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
33e40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33e50 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
33e60 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
33e70 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
33e80 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
33e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33ea0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
33eb0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
33ec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
33ed0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
33ee0 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 20  = pPg;.         
33ef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
33f00 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
33f10 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
33f20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33f30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
33f40 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
33f50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
33f60 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74     {.      sqlit
33f70 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
33f80 70 42 61 73 65 3b 0a 20 20 20 20 20 20 70 42 61  pBase;.      pBa
33f90 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  se = sqlite3Pcac
33fa0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
33fb0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33  pPCache, pgno, 3
33fc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 61  );.      if( pBa
33fd0 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  se==0 ){.       
33fe0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
33ff0 63 68 65 46 65 74 63 68 53 74 72 65 73 73 28 70  cheFetchStress(p
34000 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
34010 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20  pgno, &pBase);. 
34020 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
34030 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
34040 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34050 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
34060 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d   pPg = *ppPage =
34070 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34080 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72  tchFinish(pPager
34090 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
340a0 20 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20 69   pBase);.      i
340b0 66 28 20 70 50 67 3d 3d 30 20 29 20 72 63 20 3d  f( pPg==0 ) rc =
340c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
340d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
340e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
340f0 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
34100 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
34110 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
34120 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
34130 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
34140 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64  pager was alread
34150 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  y in the error-s
34160 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
34170 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
34180 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70  ed..    ** Set p
34190 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70  Pg to 0 and jump
341a0 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f   to the exceptio
341b0 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20  n handler.  */. 
341c0 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
341d0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
341e0 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73  re_err;.  }.  as
341f0 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
34200 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
34210 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
34220 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  e)->pPager==pPag
34230 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  er || (*ppPage)-
34240 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20  >pPager==0 );.. 
34250 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e   if( (*ppPage)->
34260 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e  pPager && !noCon
34270 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tent ){.    /* I
34280 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
34290 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63  pcache already c
342a0 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69  ontains an initi
342b0 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20  alized copy of. 
342c0 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20     ** the page. 
342d0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66  Return without f
342e0 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a  urther ado.  */.
342f0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
34300 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  <=PAGER_MAX_PGNO
34310 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f   && pgno!=PAGER_
34320 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
34330 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
34340 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
34350 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75  HIT]++;.    retu
34360 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
34370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
34380 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
34390 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
343a0 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
343b0 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
343c0 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
343d0 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67  ed.  */..    pPg
343e0 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20 20   = *ppPage;.    
343f0 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
34400 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ager;..    /* Th
34410 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
34420 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
34430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
34440 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
34450 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65     ** number gre
34460 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
34470 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f  or the unused lo
34480 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72  cking-page, is r
34490 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20  equested. */.   
344a0 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
344b0 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
344c0 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
344d0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
344e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
344f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
34500 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34510 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  ire_err;.    }..
34520 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c      if( MEMDB ||
34530 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
34540 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  pgno || noConten
34550 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61  t || !isOpen(pPa
34560 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
34570 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
34580 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
34590 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
345a0 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67  _FULL;.        g
345b0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
345c0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
345d0 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65       if( noConte
345e0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nt ){.        /*
345f0 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20   Failure to set 
34600 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
34610 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65  InJournal bit-ve
34620 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e  ctors is benign.
34630 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d  .        ** It m
34640 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  erely means that
34650 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d   we might do som
34660 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20  e extra work to 
34670 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20  journal a .     
34680 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20     ** page that 
34690 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
346a0 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20   be journaled.  
346b0 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65  Nevertheless, be
346c0 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a   sure .        *
346d0 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61  * to test the ca
346e0 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f  se where a mallo
346f0 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  c error occurs w
34700 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
34710 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  et .        ** a
34720 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65   bit in a bit ve
34730 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ctor..        */
34740 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34750 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
34760 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c();.        if(
34770 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
34780 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
34790 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
347a0 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42   rc = ) sqlite3B
347b0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
347c0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >pInJournal, pgn
347d0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  o);.          te
347e0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
347f0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
34800 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45      }.        TE
34810 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61  STONLY( rc = ) a
34820 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
34830 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e  vecs(pPager, pgn
34840 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
34850 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
34860 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
34870 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
34880 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
34890 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
348a0 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
348b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
348c0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
348d0 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22  (("ZERO %p %d\n"
348e0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
348f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
34900 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
34910 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 62 4d  al(pPager) && bM
34920 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  mapOk==0 ){.    
34930 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34940 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
34950 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
34960 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20   &iFrame);.     
34970 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34980 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
34990 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
349a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
349b0 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
349c0 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20  ==pPager );.    
349d0 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
349e0 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d  PAGER_STAT_MISS]
349f0 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  ++;.      rc = r
34a00 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69  eadDbPage(pPg, i
34a10 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  Frame);.      if
34a20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34a30 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
34a40 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34a50 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
34a60 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
34a70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20  agehash(pPg);.  
34a80 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
34a90 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63  TE_OK;..pager_ac
34aa0 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73  quire_err:.  ass
34ab0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
34ac0 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20  OK );.  if( pPg 
34ad0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
34ae0 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
34af0 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b   }.  pagerUnlock
34b00 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
34b10 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  ;..  *ppPage = 0
34b20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
34b30 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
34b40 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
34b50 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
34b60 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
34b70 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
34b80 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
34b90 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
34ba0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
34bb0 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
34bc0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
34bd0 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53   cache. .**.** S
34be0 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
34bf0 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20  agerGet().  The 
34c00 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
34c10 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
34c20 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  ** and sqlite3Pa
34c30 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74  gerGet() is that
34c40 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
34c50 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
34c60 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
34c70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
34c80 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
34c90 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
34ca0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
34cb0 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
34cc0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
34cd0 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
34ce0 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
34cf0 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
34d00 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69  .*/.DbPage *sqli
34d10 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50  te3PagerLookup(P
34d20 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
34d30 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c 69  no pgno){.  sqli
34d40 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20  te3_pcache_page 
34d50 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  *pPage;.  assert
34d60 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
34d70 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
34d80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
34d90 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30  ager->pPCache!=0
34da0 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 73 71   );.  pPage = sq
34db0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
34dc0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
34dd0 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 72 65  , pgno, 0);.  re
34de0 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
34df0 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50  heFetchFinish(pP
34e00 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
34e10 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a  gno, pPage);.}..
34e20 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
34e30 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
34e40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
34e50 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
34e60 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
34e70 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
34e80 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
34e90 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
34ea0 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
34eb0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
34ec0 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
34ed0 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
34ee0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
34ef0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
34f00 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
34f10 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
34f20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
34f30 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20  fNotNull(DbPage 
34f40 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
34f50 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
34f60 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70 50  ( pPg!=0 );.  pP
34f70 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
34f80 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66  er;.  if( pPg->f
34f90 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41  lags & PGHDR_MMA
34fa0 50 20 29 7b 0a 20 20 20 20 70 61 67 65 72 52 65  P ){.    pagerRe
34fb0 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50 67  leaseMapPage(pPg
34fc0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
34fd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
34fe0 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
34ff0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
35000 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a  used(pPager);.}.
35010 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
35020 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
35030 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
35040 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
35050 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
35060 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
35070 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
35080 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
35090 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61   every write tra
350a0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
350b0 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20  re must already 
350c0 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  be a RESERVED or
350d0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
350e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
350f0 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68  .** file when th
35100 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
35110 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  lled..**.** Open
35120 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35130 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
35140 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a  er and write a j
35150 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
35160 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
35170 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72   it. If there ar
35180 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
35190 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75  nts, open the su
351a0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20  b-journal.** as 
351b0 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  well. This funct
351c0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
351d0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
351e0 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
351f0 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72  .** opened to wr
35200 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c  ite a rollback l
35210 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  og for a transac
35220 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20  tion. It is not 
35230 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70  used .** when op
35240 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72  ening a hot jour
35250 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c  nal file to roll
35260 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
35270 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
35280 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ile is already o
35290 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62  pen (as it may b
352a0 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  e in exclusive m
352b0 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ode),.** then th
352c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74  is function just
352d0 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61   writes a journa
352e0 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
352f0 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
35300 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c  already open fil
35310 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  e. .**.** Whethe
35320 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
35330 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
35340 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
35350 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67  tion, the.** Pag
35360 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
35370 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69  tvec structure i
35380 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  s allocated..**.
35390 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
353a0 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
353b0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  g is successful.
353c0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
353d0 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  rn .** SQLITE_NO
353e0 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d  MEM if the attem
353f0 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50  pt to allocate P
35400 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
35410 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e  fails, or .** an
35420 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
35430 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69  f opening or wri
35440 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
35450 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a   file fails..*/.
35460 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
35470 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
35480 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
35490 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
354a0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
354b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
354c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
354d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
354e0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
354f0 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63  ->pVfs;   /* Loc
35500 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20  al cache of vfs 
35510 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
35520 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
35530 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
35540 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61  ER_LOCKED );.  a
35550 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
35560 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
35570 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
35580 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
35590 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
355a0 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
355b0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
355c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
355d0 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e  a no-op.  But on
355e0 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  .  ** the other 
355f0 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69  hand, this routi
35600 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
35610 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  ed if we are alr
35620 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20  eady in.  ** an 
35630 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  error state. */.
35640 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
35650 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
35660 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
35670 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70  rCode;..  if( !p
35680 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
35690 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  r) && pPager->jo
356a0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
356b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
356c0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
356d0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
356e0 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
356f0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
35700 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
35710 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
35720 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
35730 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
35740 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70    }.  .    /* Op
35750 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
35760 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ile if it is not
35770 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a   already open. *
35780 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  /.    if( !isOpe
35790 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
357a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
357b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
357c0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
357d0 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
357e0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
357f0 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
35800 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d  r->jfd);.      }
35810 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
35820 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
35830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35840 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74    /* VFS flags t
35850 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  o open journal f
35860 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ile */.         
35870 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
35880 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
35890 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
358a0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65       (pPager->te
358b0 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20  mpFile ? .      
358c0 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
358d0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
358e0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
358f0 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20  P_JOURNAL):.    
35900 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
35910 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
35920 4c 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  L).          );.
35930 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69  .        /* Veri
35940 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61  fy that the data
35950 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74  base still has t
35960 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
35970 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20  it did when.    
35980 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72      ** it was or
35990 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e  iginally opened.
359a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
359b0 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76   databaseIsUnmov
359c0 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ed(pPager);.    
359d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
359e0 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 64 65 66 20  TE_OK ){.#ifdef 
359f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
35a00 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
35a10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35a20 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
35a30 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
35a40 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
35a50 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
35a60 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66   flags, jrnlBuff
35a70 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20  erSize(pPager). 
35a80 20 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73           );.#els
35a90 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  e.          rc =
35aa0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
35ab0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
35ac0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
35ad0 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23  fd, flags, 0);.#
35ae0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a  endif.        }.
35af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
35b00 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
35b10 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
35b20 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
35b30 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a    }.  .  .    /*
35b40 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74   Write the first
35b50 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
35b60 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
35b70 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20  ile and open .  
35b80 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
35b90 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
35ba0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
35bb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35bc0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  ){.      /* TODO
35bd0 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f  : Check if all o
35be0 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c  f these are real
35bf0 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  ly required. */.
35c00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
35c10 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ec = 0;.      pP
35c20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
35c30 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
35c40 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
35c50 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
35c60 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
35c70 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
35c80 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
35c90 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
35ca0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
35cb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
35cc0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
35cd0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
35ce0 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
35cf0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
35d00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
35d10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
35d20 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
35d30 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  ER_LOCKED );.   
35d40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
35d50 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  = PAGER_WRITER_C
35d60 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20  ACHEMOD;.  }..  
35d70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
35d80 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74  .** Begin a writ
35d90 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  e-transaction on
35da0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
35db0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
35dc0 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e  a .** write-tran
35dd0 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
35de0 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  ady been opened,
35df0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
35e00 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
35e10 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61   If the exFlag a
35e20 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65  rgument is false
35e30 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
35e40 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
35e50 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  ED.** lock on th
35e60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
35e70 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
35e80 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ue, then acquire
35e90 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20   at least.** an 
35ea0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
35eb0 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
35ec0 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
35ed0 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66  no locking .** f
35ee0 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65  unctions need be
35ef0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
35f00 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
35f10 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ry argument is n
35f20 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  on-zero, then an
35f30 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70  y sub-journal op
35f40 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ened.** within t
35f50 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
35f60 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61  will be opened a
35f70 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
35f80 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73  ile. This.** has
35f90 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68   no effect if th
35fa0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
35fb0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
35fc0 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68  (as it may be wh
35fd0 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e  en.** running in
35fe0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
35ff0 20 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73   or if the trans
36000 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  action does not 
36010 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62  require a.** sub
36020 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65  -journal. If the
36030 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
36040 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20  gument is zero, 
36050 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65  then any require
36060 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d.** sub-journal
36070 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
36080 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61  in-memory if pPa
36090 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ger is an in-mem
360a0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a  ory database, .*
360b0 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d  * or using a tem
360c0 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65  porary file othe
360d0 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
360e0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
360f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
36100 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73  nt exFlag, int s
36110 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20  ubjInMemory){.  
36120 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36130 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  OK;..  if( pPage
36140 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74  r->errCode ) ret
36150 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
36160 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
36170 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
36180 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70  AGER_READER && p
36190 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41  Pager->eState<PA
361a0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70  GER_ERROR );.  p
361b0 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
361c0 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e  ory = (u8)subjIn
361d0 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41  Memory;..  if( A
361e0 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53  LWAYS(pPager->eS
361f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
36200 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ER) ){.    asser
36210 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
36220 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20  urnal==0 );..   
36230 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
36240 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
36250 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
36260 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  r is configured 
36270 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d  to use locking_m
36280 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61  ode=exclusive, a
36290 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65  nd an.      ** e
362a0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
362b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
362c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c   not already hel
362d0 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77  d, obtain it now
362e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
362f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
36300 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71  lusiveMode && sq
36310 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
36320 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
36330 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20  al, -1) ){.     
36340 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
36350 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c  kDb(pPager, EXCL
36360 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
36370 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
36380 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36390 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
363a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
363b0 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
363c0 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
363d0 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20  >pWal, 1);.     
363e0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61   }..      /* Gra
363f0 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  b the write lock
36400 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   on the log file
36410 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
36420 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20   upgrade to.    
36430 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52    ** PAGER_RESER
36440 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72  VED state. Other
36450 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
36460 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
36470 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
36480 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64  ** The busy-hand
36490 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b  ler is not invok
364a0 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f  ed if another co
364b0 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  nnection already
364c0 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  .      ** holds 
364d0 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20  the write-lock. 
364e0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  If possible, the
364f0 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
36500 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20  l call it..     
36510 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
36520 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
36530 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  iteTransaction(p
36540 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
36550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
36560 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52  * Obtain a RESER
36570 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
36580 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
36590 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72  f the exFlag par
365a0 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20  ameter.      ** 
365b0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d  is true, then im
365c0 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64  mediately upgrad
365d0 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43  e this to an EXC
365e0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
365f0 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68  .      ** busy-h
36600 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
36610 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e  can be used when
36620 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68   upgrading to th
36630 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20  e EXCLUSIVE.    
36640 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e    ** lock, but n
36650 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e  ot when obtainin
36660 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  g the RESERVED l
36670 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ock..      */.  
36680 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
36690 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53  ckDb(pPager, RES
366a0 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
366b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
366c0 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29  E_OK && exFlag )
366d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
366e0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
366f0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
36700 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
36710 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
36720 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36730 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  ){.      /* Chan
36740 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43  ge to WRITER_LOC
36750 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20  KED state..     
36760 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c   **.      ** WAL
36770 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65 72   mode sets Pager
36780 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47 45 52  .eState to PAGER
36790 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f  _WRITER_LOCKED o
367a0 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  r CACHEMOD.     
367b0 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20   ** when it has 
367c0 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  an open transact
367d0 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74  ion, but never t
367e0 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53  o DBMOD or FINIS
367f0 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  HED..      ** Th
36800 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
36810 20 74 68 6f 73 65 20 73 74 61 74 65 73 20 74 68   those states th
36820 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62  e code to roll b
36830 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  ack savepoint . 
36840 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
36850 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61  ions may copy da
36860 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ta from the sub-
36870 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65  journal into the
36880 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20   database .     
36890 20 2a 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c   ** file as well
368a0 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67   as into the pag
368b0 65 20 63 61 63 68 65 2e 20 57 68 69 63 68 20 77  e cache. Which w
368c0 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63  ould be incorrec
368d0 74 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57  t in .      ** W
368e0 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a  AL mode..      *
368f0 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
36900 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
36910 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20  RITER_LOCKED;.  
36920 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
36930 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
36940 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
36950 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
36960 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
36970 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
36980 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70  ->dbOrigSize = p
36990 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
369a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
369b0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
369c0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
369d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
369e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
369f0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
36a00 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
36a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
36a20 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
36a30 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
36a40 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
36a50 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
36a60 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
36a70 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
36a80 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25  (("TRANSACTION %
36a90 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
36aa0 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72  ager)));.  retur
36ab0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
36ac0 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74  ark a single dat
36ad0 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
36ae0 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ble. The page is
36af0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
36b00 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e  e .** main journ
36b10 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
36b20 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49  l as required. I
36b30 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72  f the page is wr
36b40 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e  itten into.** on
36b50 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
36b60 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  s, the correspon
36b70 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
36b80 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72  in the .** Pager
36b90 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
36ba0 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  ec and the Pager
36bb0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
36bc0 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a  epoint bitvecs.*
36bd0 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61  * of any open sa
36be0 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72  vepoints as appr
36bf0 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
36c00 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
36c10 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
36c20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
36c30 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
36c40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36c50 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 6e 4a 6f 75  _OK;.  int inJou
36c60 72 6e 61 6c 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rnal;..  /* This
36c70 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20   routine is not 
36c80 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20  called unless a 
36c90 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
36ca0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20  n has already . 
36cb0 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64   ** been started
36cc0 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
36cd0 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  le may or may no
36ce0 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69  t be open at thi
36cf0 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74  s point..  ** It
36d00 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
36d10 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
36d20 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ate..  */.  asse
36d30 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
36d40 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
36d50 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c  _LOCKED.       |
36d60 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
36d70 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
36d80 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
36d90 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
36da0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
36db0 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
36dc0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
36dd0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
36de0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
36df0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 30 20 29  er->errCode==0 )
36e00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
36e10 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20  er->readOnly==0 
36e20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
36e30 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  (pPg);..  /* The
36e40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
36e50 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  eds to be opened
36e60 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72  . Higher level r
36e70 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72  outines have alr
36e80 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  eady.  ** obtain
36e90 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ed the necessary
36ea0 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20   locks to begin 
36eb0 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
36ec0 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20  ction, but the. 
36ed0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
36ee0 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79  rnal might not y
36ef0 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e  et be open. Open
36f00 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20   it now if this 
36f10 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a  is the case..  *
36f20 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64  *.  ** This is d
36f30 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  one before calli
36f40 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
36f50 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74  MakeDirty() on t
36f60 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f  he page. .  ** O
36f70 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74 20  therwise, if it 
36f80 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20  were done after 
36f90 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50  calling sqlite3P
36fa0 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29  cacheMakeDirty()
36fb0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65  , then.  ** an e
36fc0 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72  rror might occur
36fd0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 77   and the pager w
36fe0 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57  ould end up in W
36ff0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
37000 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67  te.  ** with pag
37010 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  es marked as dir
37020 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ty in the cache.
37030 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
37040 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37050 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
37060 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
37070 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
37080 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
37090 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
370a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
370b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
370c0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
370d0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
370e0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
370f0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
37100 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20  Pager) );..  /* 
37110 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
37120 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
37130 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
37140 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
37150 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
37160 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
37170 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
37180 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
37190 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
371a0 50 67 29 3b 0a 20 20 69 6e 4a 6f 75 72 6e 61 6c  Pg);.  inJournal
371b0 20 3d 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c   = pageInJournal
371c0 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
371d0 20 69 66 28 20 69 6e 4a 6f 75 72 6e 61 6c 20 26   if( inJournal &
371e0 26 20 28 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  & (pPager->nSave
371f0 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 21 73 75 62  point==0 || !sub
37200 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
37210 67 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  g)) ){.    asser
37220 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
37230 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 65 6c  pPager) );.  }el
37240 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68  se{.  .    /* Th
37250 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
37260 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
37270 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
37280 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
37290 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
372a0 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
372b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
372c0 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
372d0 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
372e0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
372f0 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
37300 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
37310 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
37320 69 66 28 20 21 69 6e 4a 6f 75 72 6e 61 6c 20 26  if( !inJournal &
37330 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  & !pagerUseWal(p
37340 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
37350 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
37360 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Wal(pPager)==0 )
37370 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  ;.      if( pPg-
37380 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
37390 62 4f 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f  bOrigSize && isO
373a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
373b0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20   ){.        u32 
373c0 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63  cksum;.        c
373d0 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20  har *pData2;.   
373e0 20 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20       i64 iOff = 
373f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
37400 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ff;..        /* 
37410 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
37420 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
37430 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
37440 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
37450 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
37460 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
37470 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
37480 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
37490 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
374a0 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
374b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
374c0 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
374d0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
374e0 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
374f0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
37500 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  lHdr<=pPager->jo
37510 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
37520 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
37530 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
37540 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
37550 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
37560 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
37570 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
37580 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
37590 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20  u8*)pData2);..  
375a0 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66        /* Even if
375b0 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75   an IO or diskfu
375c0 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ll error occurs 
375d0 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  while journallin
375e0 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  g the.        **
375f0 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f   page in the blo
37600 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68  ck above, set th
37610 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67  e need-sync flag
37620 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20   for the page.. 
37630 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
37640 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
37650 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
37660 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
37670 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  gic in.        *
37680 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  * playback_one_p
37690 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b  age() will think
376a0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
376b0 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f  eeds to be resto
376c0 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
376d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
376e0 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49  ile. And if an I
376f0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
37700 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20  hile doing so,. 
37710 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63         ** then c
37720 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f  orruption may fo
37730 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  llow..        */
37740 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c  .        pPg->fl
37750 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
37760 44 5f 53 59 4e 43 3b 0a 0a 20 20 20 20 20 20 20  D_SYNC;..       
37770 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
37780 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
37790 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  Off, pPg->pgno);
377a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
377b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
377c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
377d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
377e0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
377f0 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
37800 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b  >pageSize, iOff+
37810 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  4);.        if( 
37820 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
37830 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
37840 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
37850 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
37860 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61   iOff+pPager->pa
37870 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29  geSize+4, cksum)
37880 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37890 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
378a0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
378b0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
378c0 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
378d0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
378e0 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
378f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
37900 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67  journalOff, pPag
37910 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a  er->pageSize));.
37920 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e          PAGER_IN
37930 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
37940 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a  _writej_count);.
37950 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
37960 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE(("JOURNAL %d 
37970 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
37980 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e  =%d hash(%08x)\n
37990 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
379a0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
379b0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
379c0 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
379d0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
379e0 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61  D_SYNC)?1:0), pa
379f0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
37a00 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 50  )));..        pP
37a10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
37a20 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e   += 8 + pPager->
37a30 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
37a40 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
37a50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
37a60 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
37a70 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
37a80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
37a90 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
37aa0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
37ab0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
37ac0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
37ad0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
37ae0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
37af0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
37b00 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
37b10 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c   );.        rc |
37b20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
37b30 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
37b40 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
37b50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37b60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37b70 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
37b80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
37b90 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
37ba0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
37bb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37bc0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
37bd0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49  State!=PAGER_WRI
37be0 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20  TER_DBMOD ){.   
37bf0 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
37c00 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
37c10 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a  SYNC;.        }.
37c20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
37c30 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE(("APPEND %d p
37c40 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
37c50 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
37c60 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
37c70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
37c80 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
37c90 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
37ca0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
37cb0 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a  1:0)));.      }.
37cc0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
37cd0 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
37ce0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
37cf0 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
37d00 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
37d10 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
37d20 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
37d30 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
37d40 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
37d50 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
37d60 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
37d70 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
37d80 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
37d90 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
37da0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
37db0 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
37dc0 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
37dd0 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
37de0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 53    if( pPager->nS
37df0 61 76 65 70 6f 69 6e 74 3e 30 20 26 26 20 73 75  avepoint>0 && su
37e00 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
37e10 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Pg) ){.      rc 
37e20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
37e30 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
37e40 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
37e50 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
37e60 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
37e70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
37e80 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20  bSize<pPg->pgno 
37e90 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
37ea0 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
37eb0 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  o;.  }.  return 
37ec0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
37ed0 73 20 69 73 20 61 20 76 61 72 69 61 6e 74 20 6f  s is a variant o
37ee0 66 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  f sqlite3PagerWr
37ef0 69 74 65 28 29 20 74 68 61 74 20 72 75 6e 73 20  ite() that runs 
37f00 77 68 65 6e 20 74 68 65 20 73 65 63 74 6f 72 20  when the sector 
37f10 73 69 7a 65 0a 2a 2a 20 69 73 20 6c 61 72 67 65  size.** is large
37f20 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20  r than the page 
37f30 73 69 7a 65 2e 20 20 53 51 4c 69 74 65 20 6d 61  size.  SQLite ma
37f40 6b 65 73 20 74 68 65 20 28 72 65 61 73 6f 6e 61  kes the (reasona
37f50 62 6c 65 29 20 61 73 73 75 6d 70 74 69 6f 6e 20  ble) assumption 
37f60 74 68 61 74 0a 2a 2a 20 61 6c 6c 20 62 79 74 65  that.** all byte
37f70 73 20 6f 66 20 61 20 73 65 63 74 6f 72 20 61 72  s of a sector ar
37f80 65 20 77 72 69 74 74 65 6e 20 74 6f 67 65 74 68  e written togeth
37f90 65 72 20 62 79 20 68 61 72 64 77 61 72 65 2e 20  er by hardware. 
37fa0 20 48 65 6e 63 65 2c 20 61 6c 6c 20 62 79 74 65   Hence, all byte
37fb0 73 20 6f 66 0a 2a 2a 20 61 20 73 65 63 74 6f 72  s of.** a sector
37fc0 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
37fd0 6e 61 6c 6c 65 64 20 69 6e 20 63 61 73 65 20 6f  nalled in case o
37fe0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 69  f a power loss i
37ff0 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
38000 2a 2a 20 61 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a  ** a write..**.*
38010 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 73  * Usually, the s
38020 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 6c 65  ector size is le
38030 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
38040 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
38050 65 2c 20 69 6e 20 77 68 69 63 68 0a 2a 2a 20 63  e, in which.** c
38060 61 73 65 20 70 61 67 65 73 20 63 61 6e 20 62 65  ase pages can be
38070 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 77 72   individually wr
38080 69 74 74 65 6e 2e 20 20 54 68 69 73 20 72 6f 75  itten.  This rou
38090 74 69 6e 65 20 6f 6e 6c 79 20 72 75 6e 73 20 69  tine only runs i
380a0 6e 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 61  n the exceptiona
380b0 6c 0a 2a 2a 20 63 61 73 65 20 77 68 65 72 65 20  l.** case where 
380c0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
380d0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
380e0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  e sector size..*
380f0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
38100 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67  NOINLINE int pag
38110 65 72 57 72 69 74 65 4c 61 72 67 65 53 65 63 74  erWriteLargeSect
38120 6f 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  or(PgHdr *pPg){.
38130 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
38140 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
38150 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
38160 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  */.  Pgno nPageC
38170 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
38180 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
38190 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
381a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
381b0 0a 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20  .  Pgno pg1;    
381c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
381d0 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
381e0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
381f0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
38200 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 20   */.  int nPage 
38210 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
38220 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
38230 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
38240 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
38250 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  al */.  int ii; 
38260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38270 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
38280 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
38290 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20  needSync = 0;   
382a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
382b0 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68  ue if any page h
382c0 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  as PGHDR_NEED_SY
382d0 4e 43 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70  NC */.  Pager *p
382e0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
382f0 67 65 72 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  ger;   /* The pa
38300 67 65 72 20 74 68 61 74 20 6f 77 6e 73 20 70 50  ger that owns pP
38310 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61 67  g */.  Pgno nPag
38320 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
38330 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
38340 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
38350 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  e);..  /* Set th
38360 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53  e doNotSpill NOS
38370 59 4e 43 20 62 69 74 20 74 6f 20 31 2e 20 54 68  YNC bit to 1. Th
38380 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
38390 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20   cannot allow.  
383a0 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ** a journal hea
383b0 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
383c0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
383d0 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
383e0 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
383f0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ion..  */.  asse
38400 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
38410 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
38420 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
38430 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 29 3d  ILLFLAG_NOSYNC)=
38440 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =0 );.  pPager->
38450 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50  doNotSpill |= SP
38460 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 3b 0a  ILLFLAG_NOSYNC;.
38470 0a 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b  .  /* This trick
38480 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
38490 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
384a0 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
384b0 20 61 72 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 74   are.  ** an int
384c0 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
384d0 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
384e0 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
384f0 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 6f 66 20  ntifier.  ** of 
38500 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
38510 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
38520 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
38530 20 20 2a 2f 0a 20 20 70 67 31 20 3d 20 28 28 70    */.  pg1 = ((p
38540 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28  Pg->pgno-1) & ~(
38550 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
38560 29 29 20 2b 20 31 3b 0a 0a 20 20 6e 50 61 67 65  )) + 1;..  nPage
38570 43 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e  Count = pPager->
38580 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 50  dbSize;.  if( pP
38590 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
385a0 6e 74 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  nt ){.    nPage 
385b0 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70  = (pPg->pgno - p
385c0 67 31 29 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69  g1)+1;.  }else i
385d0 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
385e0 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
385f0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 6e 50 61 67  ount ){.    nPag
38600 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31  e = nPageCount+1
38610 2d 70 67 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -pg1;.  }else{. 
38620 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
38630 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 7d 0a 20  PerSector;.  }. 
38640 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29   assert(nPage>0)
38650 3b 0a 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d  ;.  assert(pg1<=
38660 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 61 73  pPg->pgno);.  as
38670 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29  sert((pg1+nPage)
38680 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  >pPg->pgno);..  
38690 66 6f 72 28 69 69