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

Artifact cb7a3990eabd895f6487c0856a7fec02b5e40faa:


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 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
7c50: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
7c60: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c70: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
7c80: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
7c90: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
7ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7cb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
7cc0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
7cd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
7ce0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
7cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7d00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7d10: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d30: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
7d40: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7d60: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7d80: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
7d90: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
7da0: 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ader */.  sqlite
7db0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
7dc0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
7dd0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
7de0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
7df0: 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53  sses */.  PagerS
7e00: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
7e10: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
7e20: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
7e30: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
7e40: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
7e50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e60: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
7e70: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
7e80: 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e  u32 iDataVersion
7e90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
7ec0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68   changes */.  ch
7ed0: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7ee0: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7ef0: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7f00: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7f10: 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d  ges */..  int nM
7f20: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7f30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f40: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7f50: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7f60: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
7f70: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
7f80: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
7f90: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
7fa0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
7fb0: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
7fc0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7fd0: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7fe0: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7ff0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
8000: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
8010: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
8020: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8080: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8090: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
80a0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
80b0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
80c0: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
80d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
80e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
80f0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
8100: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
8110: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
8120: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
8130: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
8140: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8150: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8160: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8170: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8180: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8190: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
81a0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
81d0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
81e0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8200: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
8210: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8220: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
8230: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
8240: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
8250: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8270: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8280: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
82a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
82b0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
82c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
82d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
82e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
82f0: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
8300: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
8310: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
8320: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
8330: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
8340: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
8350: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8360: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8370: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8390: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
83a0: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
83b0: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
83c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
83d0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
83f0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
8400: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
8410: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8420: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
8430: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
8440: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
8450: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
8460: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
8470: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
8480: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8490: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
84a0: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
84b0: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
84c0: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
84d0: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
84e0: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
84f0: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
8500: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
8510: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
8520: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
8530: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
8540: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
8550: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
8560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8570: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
8580: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8590: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
85a0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
85c0: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
85d0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
85e0: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
85f0: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
8600: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8610: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
8620: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
8630: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8640: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
8670: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
8680: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8690: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
86c0: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
86d0: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
86e0: 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f  /*.** Indexes fo
86f0: 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72  r use with Pager
8700: 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61  .aStat[]. The Pa
8710: 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61  ger.aStat[] arra
8720: 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  y contains.** th
8730: 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65  e values accesse
8740: 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c  d by passing SQL
8750: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
8760: 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49  HE_HIT, CACHE_MI
8770: 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f  SS .** or CACHE_
8780: 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33  WRITE to sqlite3
8790: 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f  _db_status()..*/
87a0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
87b0: 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66  TAT_HIT   0.#def
87c0: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d  ine PAGER_STAT_M
87d0: 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50  ISS  1.#define P
87e0: 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20  AGER_STAT_WRITE 
87f0: 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  2../*.** The fol
8800: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
8810: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
8820: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
8830: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
8840: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
8850: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8860: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8870: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8880: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8890: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
88a0: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
88b0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
88c0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
88d0: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
88e0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
88f0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8900: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8910: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8920: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8930: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8940: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8950: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8960: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8970: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8980: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8990: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
89a0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
89b0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
89c0: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
89d0: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
89e0: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
89f0: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8a00: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8a10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8a20: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8a30: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8a40: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8a50: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8a60: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8a70: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8a80: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8a90: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8aa0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8ab0: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8ac0: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8ae0: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8af0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8b00: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8b10: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8b20: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8b30: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8b40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8b50: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8b60: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8b70: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8b80: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8b90: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8ba0: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8bb0: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8bc0: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8bd0: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8be0: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8bf0: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8c00: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8c10: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8c20: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8c30: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8c40: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8c50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8c60: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8c70: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8c80: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8c90: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
8ca0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
8cb0: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
8cc0: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
8cd0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
8ce0: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
8cf0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
8d00: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
8d10: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
8d20: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
8d30: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
8d40: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
8d50: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
8d60: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
8d70: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
8d80: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
8d90: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
8da0: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
8db0: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
8dc0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
8dd0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
8de0: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
8df0: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
8e00: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
8e10: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
8e20: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
8e30: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
8e40: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
8e50: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
8e60: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
8e70: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
8e80: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
8e90: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
8ea0: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
8eb0: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
8ec0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
8ed0: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
8ee0: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
8ef0: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
8f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8f10: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
8f20: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
8f30: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
8f40: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
8f50: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
8f60: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
8f70: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
8f80: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
8f90: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
8fa0: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
8fb0: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
8fc0: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
8fd0: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
8fe0: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
8ff0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
9000: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
9010: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
9020: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
9030: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
9040: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
9050: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
9060: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
9070: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
9080: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
9090: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
90a0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
90b0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
90c0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
90d0: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
90e0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
90f0: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
9100: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
9110: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
9120: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
9130: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
9140: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
9150: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
9160: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
9170: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
9180: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
9190: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
91a0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
91b0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
91c0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
91d0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
91e0: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
91f0: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
9200: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
9210: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
9220: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
9230: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
9240: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
9250: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
9260: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
9270: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
9280: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
9290: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
92a0: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
92b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
92c0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
92d0: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
92e0: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
92f0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9300: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
9310: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9320: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
9330: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
9340: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
9350: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
9360: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
9370: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
9380: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
9390: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
93a0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
93b0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
93c0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
93d0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
93e0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
93f0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
9400: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
9410: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
9420: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
9430: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
9440: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9450: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
9460: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
9470: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
9480: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
9490: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
94a0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
94b0: 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a  ->pMethods!=0)..
94c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
94d0: 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72 20  e if this pager 
94e0: 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68 65  uses a write-ahe
94f0: 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f  ad log instead o
9500: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72  f the usual.** r
9510: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
9520: 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   Otherwise false
9530: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
9540: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61  ITE_OMIT_WAL.sta
9550: 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73 65  tic int pagerUse
9560: 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
9570: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  r){.  return (pP
9580: 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a  ager->pWal!=0);.
9590: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
95a0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29 20   pagerUseWal(x) 
95b0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
95c0: 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30  RollbackWal(x) 0
95d0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 57  .# define pagerW
95e0: 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79  alFrames(v,w,x,y
95f0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9600: 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
9610: 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  nt(z) SQLITE_OK.
9620: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65  # define pagerBe
9630: 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
9640: 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  on(z) SQLITE_OK.
9650: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
9660: 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73  NDEBUG ./*.** Us
9670: 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73  age:.**.**   ass
9680: 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
9690: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
96a0: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  );.**.** This fu
96b0: 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79  nction runs many
96c0: 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20   asserts to try 
96d0: 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73  to find inconsis
96e0: 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68  tencies in.** th
96f0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
9700: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
9710: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
9720: 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72  int assert_pager
9730: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29  _state(Pager *p)
9740: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
9750: 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61  r = p;..  /* Sta
9760: 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  te must be valid
9770: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
9780: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9790: 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70  OPEN.       || p
97a0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
97b0: 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c  READER.       ||
97c0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97d0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
97e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
97f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9800: 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
9810: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9820: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
9830: 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  OD.       || p->
9840: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9850: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20  ITER_FINISHED.  
9860: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9870: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20  e==PAGER_ERROR. 
9880: 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64   );..  /* Regard
9890: 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72  less of the curr
98a0: 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d  ent state, a tem
98b0: 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f  p-file connectio
98c0: 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73  n always behaves
98d0: 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68  .  ** as if it h
98e0: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
98f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
9900: 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65  base file. It ne
9910: 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a  ver updates.  **
9920: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
9930: 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68  ter field, so th
9940: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
9950: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
9960: 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
9970: 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65  ert( p->tempFile
9980: 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d  ==0 || p->eLock=
9990: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
99a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
99b0: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
99c0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
99d0: 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20  ntDone );..  /* 
99e0: 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61  If the useJourna
99f0: 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  l flag is clear,
9a00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9a10: 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e  e must be "OFF".
9a20: 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68   .  ** And if th
9a30: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
9a40: 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75  s "OFF", the jou
9a50: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e  rnal file must n
9a60: 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f  ot be open..  */
9a70: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f  .  assert( p->jo
9a80: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9a90: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9aa0: 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61   || p->useJourna
9ab0: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
9ac0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
9ad0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9ae0: 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28  _OFF || !isOpen(
9af0: 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  p->jfd) );..  /*
9b00: 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44   Check that MEMD
9b10: 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63  B implies noSync
9b20: 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  . And an in-memo
9b30: 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63  ry journal. Sinc
9b40: 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61  e .  ** this mea
9b50: 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ns an in-memory 
9b60: 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e  pager performs n
9b70: 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20  o IO at all, it 
9b80: 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72  cannot encounter
9b90: 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51   .  ** either SQ
9ba0: 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
9bb0: 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67  LITE_FULL during
9bc0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69   rollback or whi
9bd0: 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20  le finalizing . 
9be0: 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   ** a journal fi
9bf0: 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68  le. (although th
9c00: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  e in-memory jour
9c10: 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  nal implementati
9c20: 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74  on may .  ** ret
9c30: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
9c40: 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65  _NOMEM while the
9c50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
9c60: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e   being written).
9c70: 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65   It .  ** is the
9c80: 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69  refore not possi
9c90: 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  ble for an in-me
9ca0: 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e  mory pager to en
9cb0: 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20  ter the ERROR . 
9cc0: 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a   ** state..  */.
9cd0: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
9ce0: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
9cf0: 65 6e 28 70 2d 3e 66 64 29 20 29 3b 0a 20 20 20  en(p->fd) );.   
9d00: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79   assert( p->noSy
9d10: 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nc );.    assert
9d20: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9d30: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9d40: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
9d50: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9d60: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9d70: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
9d80: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
9d90: 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ( p->eState!=PAG
9da0: 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65  ER_ERROR && p->e
9db0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
9dc0: 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  N );.    assert(
9dd0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d   pagerUseWal(p)=
9de0: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
9df0: 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  If changeCountDo
9e00: 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53  ne is set, a RES
9e10: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72  ERVED lock or gr
9e20: 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
9e30: 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66  ld.  ** on the f
9e40: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
9e50: 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  rt( pPager->chan
9e60: 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c  geCountDone==0 |
9e70: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  | pPager->eLock>
9e80: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
9e90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
9ea0: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
9eb0: 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  CK );..  switch(
9ec0: 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20   p->eState ){.  
9ed0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45    case PAGER_OPE
9ee0: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
9ef0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
9f00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9f10: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9f20: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9f30: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
9f40: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
9f50: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c  r->pPCache)==0 |
9f60: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
9f70: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
9f80: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9f90: 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20  ER_READER:.     
9fa0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9fb0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9fc0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9fd0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9fe0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9ff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a000: 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
a010: 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  CK );.      brea
a020: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a030: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
a040: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a050: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a060: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a070: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a080: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a090: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
a0a0: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a0b0: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
a0c0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a0d0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
a0e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a0f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a100: 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  >dbSize==pPager-
a110: 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
a120: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a130: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a140: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a150: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a160: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a170: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a180: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a190: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a1a0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
a1b0: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
a1c0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a1d0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
a1e0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a1f0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
a200: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
a210: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a220: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a230: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
a240: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a250: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
a260: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
a270: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
a280: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
a290: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
a2a0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
a2b0: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
a2c0: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
a2d0: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
a2e0: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
a2f0: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
a300: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
a310: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
a320: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
a330: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
a340: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
a350: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a360: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a370: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a380: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
a390: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a3a0: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a3b0: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a3c0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a3d0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a3e0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a3f0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a400: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a410: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
a420: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a430: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a440: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a450: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
a460: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a470: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a480: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a490: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a4a0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a4b0: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
a4c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a4d0: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a4e0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a4f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a500: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a510: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a520: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a530: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a540: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a550: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
a560: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a570: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a580: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a590: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a5a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a5b0: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a5c0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a5d0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a5e0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
a5f0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a600: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a610: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
a620: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a640: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a650: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
a660: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a670: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a680: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a690: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a6a0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a6b0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a6c0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a6d0: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a6e0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a6f0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a700: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a710: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a720: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a730: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a740: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a750: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a760: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a770: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a780: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
a790: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
a7a0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
a7b0: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
a7c0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
a7d0: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
a7e0: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
a7f0: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
a800: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
a810: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
a820: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
a830: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
a840: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
a850: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a860: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
a870: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a880: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
a890: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
a8a0: 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 50  pPCache)>0 || pP
a8b0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
a8c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a8d0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a8e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a8f0: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a900: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a910: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a920: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a930: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a940: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
a950: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
a960: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
a970: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
a980: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
a990: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
a9a0: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
a9b0: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
a9c0: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
a9d0: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
a9e0: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
a9f0: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
aa00: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
aa10: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
aa20: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
aa30: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
aa40: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
aa50: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
aa60: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
aa70: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
aa80: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
aa90: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
aaa0: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
aab0: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
aac0: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
aad0: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
aae0: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
aaf0: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
ab00: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
ab10: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
ab20: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
ab30: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
ab40: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
ab50: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
ab60: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
ab70: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
ab80: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
ab90: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
aba0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
abb0: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
abc0: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
abd0: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
abe0: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
abf0: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
ac00: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
ac10: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
ac20: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
ac30: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
ac40: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
ac50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
ac60: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
ac70: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
ac80: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
ac90: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
aca0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
acb0: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
acc0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
acd0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ace0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
acf0: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
ad00: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ad10: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
ad20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
ad30: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
ad40: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ad50: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
ad60: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
ad70: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
ad80: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
ad90: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
ada0: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
adb0: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
adc0: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
add0: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
ade0: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
adf0: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
ae00: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
ae10: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
ae20: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
ae30: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ae40: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
ae50: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
ae60: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
ae70: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
ae80: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
ae90: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
aea0: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
aeb0: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
aec0: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
aed0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
aee0: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
aef0: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
af00: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
af10: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
af20: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
af30: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
af40: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
af50: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
af60: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
af70: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
af80: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
af90: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
afa0: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
afb0: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
afc0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
afd0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
afe0: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
aff0: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
b000: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
b010: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
b020: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
b030: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
b040: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
b050: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
b060: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
b070: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
b080: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
b090: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
b0a0: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
b0b0: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
b0c0: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
b0d0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
b0e0: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
b0f0: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
b100: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
b110: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
b120: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
b130: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
b140: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b150: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
b160: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
b170: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
b180: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b190: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
b1a0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
b1b0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
b1c0: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
b1d0: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
b1e0: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
b1f0: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
b200: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
b210: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b220: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
b230: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
b240: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
b250: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
b260: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
b270: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
b280: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
b290: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
b2a0: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b2b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b2c0: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b2d0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b2e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
b2f0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
b300: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
b310: 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  p;.  Pgno pgno =
b320: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e   pPg->pgno;.  in
b330: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
b340: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
b350: 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oint; i++){.    
b360: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
b370: 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20  vepoint[i];.    
b380: 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67  if( p->nOrig>=pg
b390: 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  no && 0==sqlite3
b3a0: 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
b3b0: 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  l(p->pInSavepoin
b3c0: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
b3d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b3e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b3f0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
b400: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
b410: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b420: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b430: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b440: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b450: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b460: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
b470: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
b480: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b490: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
b4a0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
b4b0: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64  g->pgno);.}.#end
b4c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
b4d0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b4e0: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
b4f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b500: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
b510: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
b520: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
b530: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
b540: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
b550: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
b560: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b570: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b580: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
b590: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
b5a0: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
b5b0: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
b5c0: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
b5d0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
b5e0: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
b5f0: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
b600: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
b610: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
b620: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
b630: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
b640: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
b650: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b660: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
b670: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
b680: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b690: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b6a0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b6b0: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
b6c0: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
b6d0: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
b6e0: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
b6f0: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
b700: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
b710: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  ).../*.** Write 
b720: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b730: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
b740: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
b750: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
b760: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
b770: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
b780: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
b790: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
b7a0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
b7b0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b7c0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b7d0: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
b7e0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
b7f0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
b800: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
b810: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
b820: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
b830: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
b840: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
b850: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
b860: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
b870: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f  her NO_LOCK.** o
b880: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52  r SHARED_LOCK. R
b890: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
b8a0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
b8b0: 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28  call to xUnlock(
b8c0: 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73  ).** succeeds, s
b8d0: 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f  et the Pager.eLo
b8e0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d  ck variable to m
b8f0: 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70  atch the (attemp
b900: 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a  ted) new lock..*
b910: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b920: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b930: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
b940: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
b950: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
b960: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
b970: 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f  y it. See the co
b980: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
b990: 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55  #define of .** U
b9a0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
b9b0: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
b9c0: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
b9d0: 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63  c int pagerUnloc
b9e0: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
b9f0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
ba00: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ba10: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
ba20: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
ba30: 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
ba40: 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29  ->eLock==eLock )
ba50: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
ba60: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  k==NO_LOCK || eL
ba70: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ba80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
ba90: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
baa0: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
bab0: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  er)==0 );.  if( 
bac0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
bad0: 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
bae0: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
baf0: 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63  =eLock );.    rc
bb00: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63   = pPager->noLoc
bb10: 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  k ? SQLITE_OK : 
bb20: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
bb30: 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63  pPager->fd, eLoc
bb40: 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  k);.    if( pPag
bb50: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f  er->eLock!=UNKNO
bb60: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  WN_LOCK ){.     
bb70: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
bb80: 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20   (u8)eLock;.    
bb90: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
bba0: 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  UNLOCK %p %d\n",
bbb0: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
bbc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bbd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
bbe0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
bbf0: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
bc00: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
bc10: 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f  either SHARED_LO
bc20: 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f  CK,.** RESERVED_
bc30: 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56  LOCK or EXCLUSIV
bc40: 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63  E_LOCK. If the c
bc50: 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73  aller is success
bc60: 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20  ful, set the.** 
bc70: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
bc80: 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20  able to the new 
bc90: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a  locking state. .
bca0: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
bcb0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
bcc0: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
bcd0: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
bce0: 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61  nction is .** ca
bcf0: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
bd00: 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68  ify it unless th
bd10: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
bd20: 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45  ate is EXCLUSIVE
bd30: 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74  _LOCK. .** See t
bd40: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
bd50: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
bd60: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
bd70: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
bd80: 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  .** of this..*/.
bd90: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
bda0: 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  LockDb(Pager *pP
bdb0: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
bdc0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
bdd0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
bde0: 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  t( eLock==SHARED
bdf0: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
be00: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
be10: 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
be20: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  E_LOCK );.  if( 
be30: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c  pPager->eLock<eL
be40: 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ock || pPager->e
be50: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
be60: 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  CK ){.    rc = p
be70: 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20  Pager->noLock ? 
be80: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
be90: 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
bea0: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
beb0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bec0: 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e  _OK && (pPager->
bed0: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
bee0: 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  OCK||eLock==EXCL
bef0: 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20  USIVE_LOCK) ){. 
bf00: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
bf10: 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a  ck = (u8)eLock;.
bf20: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
bf30: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
bf40: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
bf50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
bf60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
bf70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
bf80: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
bf90: 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
bfa0: 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
bfb0: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75  tion.** can be u
bfc0: 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61  sed with this pa
bfd0: 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a  ger. The optimiz
bfe0: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
bff0: 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29  d if:.**.**  (a)
c000: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
c010: 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43  ned by OsDeviceC
c020: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29  haracteristics()
c030: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a   indicates that.
c040: 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61  **      a databa
c050: 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77  se page may be w
c060: 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
c070: 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74  y, and.**  (b) t
c080: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c090: 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a  d by OsSectorSiz
c0a0: 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  e() is less than
c0b0: 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20   or equal.**    
c0c0: 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69    to the page si
c0d0: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  ze..**.** The op
c0e0: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c  timization is al
c0f0: 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65  so always enable
c100: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
c110: 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20  files. It is.** 
c120: 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c  an error to call
c130: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c140: 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e  f pPager is open
c150: 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed on an in-memo
c160: 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  ry.** database..
c170: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
c180: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
c190: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
c1a0: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
c1b0: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
c1c0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
c1d0: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
c1e0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
c1f0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
c200: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
c210: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
c220: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
c230: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c240: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
c250: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
c260: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
c270: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c280: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
c290: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
c2a0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
c2b0: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
c2e0: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
c2f0: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b      int nSector;
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c310: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
c320: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  size */.    int 
c330: 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  szPage;         
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c350: 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   Page size */.. 
c360: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
c370: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
c380: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
c390: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
c3a0: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
c3b0: 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f  >fd);.    nSecto
c3c0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74  r = pPager->sect
c3d0: 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61  orSize;.    szPa
c3e0: 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
c3f0: 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65  eSize;..    asse
c400: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
c410: 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
c420: 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >8));.    assert
c430: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c440: 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
c450: 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  >8));.    if( 0=
c460: 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43  =(dc&(SQLITE_IOC
c470: 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67  AP_ATOMIC|(szPag
c480: 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f  e>>8)) || nSecto
c490: 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20  r>szPage) ){.   
c4a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c4b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c4c0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c4d0: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
c4e0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
c4f0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
c500: 65 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  e jrnlBufferSize
c510: 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 0.#endif../*
c520: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
c530: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
c540: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
c550: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
c560: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
c570: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
c580: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
c590: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
c5a0: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
c5b0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
c5c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
c5d0: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
c5e0: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
c5f0: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
c600: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
c610: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
c620: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
c630: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
c640: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
c650: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
c660: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
c670: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
c680: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
c690: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
c6a0: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
c6b0: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
c6c0: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
c6d0: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c6e0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
c6f0: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
c700: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
c710: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
c720: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
c730: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
c740: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
c750: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
c760: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
c770: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
c780: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
c790: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
c7a0: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
c7b0: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
c7c0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
c7d0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c7e0: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
c7f0: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
c800: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
c810: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
c820: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
c830: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
c840: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
c850: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
c860: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
c870: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
c880: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
c890: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
c8a0: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
c8b0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
c8c0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
c8d0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
c8e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c8f0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
c900: 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
c910: 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
c920: 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67  DR_DIRTY) || pPg
c930: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
c940: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
c950: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
c960: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
c970: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
c980: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
c990: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
c9a0: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
c9b0: 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48  sh(X).#define CH
c9c0: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
c9d0: 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48  if  /* SQLITE_CH
c9e0: 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a  ECK_PAGES */../*
c9f0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
ca00: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
ca10: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
ca20: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
ca30: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20  e open..** This 
ca40: 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
ca50: 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74  s to read a mast
ca60: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ca70: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  name from the .*
ca80: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
ca90: 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73  e and, if succes
caa0: 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20  sful, copies it 
cab0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
cac0: 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  lied .** by the 
cad0: 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d  caller. See comm
cae0: 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65  ents above write
caf0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
cb00: 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a  for the format.*
cb10: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
cb20: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
cb30: 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68   file name at th
cb40: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
cb50: 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a  al file..**.** z
cb60: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
cb70: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
cb80: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
cb90: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
cba0: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
cbb0: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
cbc0: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
cbd0: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
cbe0: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
cbf0: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
cc00: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
cc10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
cc20: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
cc30: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
cc40: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
cc50: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
cc60: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
cc70: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
cc80: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
cc90: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
cca0: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
ccb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
ccc0: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
ccd0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
cce0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  **.** If a maste
ccf0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
cd00: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61  ame is present a
cd10: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
cd20: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
cd30: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  , then it is cop
cd40: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ied into the buf
cd50: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
cd60: 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20  y zMaster. A.** 
cd70: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
cd80: 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20  yte is appended 
cd90: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f  to the buffer fo
cda0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74  llowing the mast
cdb0: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
cdc0: 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  le name..**.** I
cdd0: 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e  f it is determin
cde0: 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65  ed that no maste
cdf0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
ce00: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a  ame is present .
ce10: 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73  ** zMaster[0] is
ce20: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
ce30: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
ce40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
ce50: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
ce60: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
ce70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
ce80: 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
ce90: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
cea0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
ceb0: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
cec0: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
ced0: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
cee0: 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61  zMaster, u32 nMa
cef0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
cf20: 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b  de */.  u32 len;
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20     /* Length in 
cf50: 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20  bytes of master 
cf60: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
cf70: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cf90: 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79  Total size in by
cfa0: 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  tes of journal f
cfb0: 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75  ile pJrnl */.  u
cfc0: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
cfd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20            /* MJ 
cfe0: 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72  checksum value r
cff0: 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ead from journal
d000: 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
d030: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
d040: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
d050: 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62  gic[8];   /* A b
d060: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
d070: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
d080: 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  /.  zMaster[0] =
d090: 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51   '\0';..  if( SQ
d0a0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d0b0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d0c0: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20  (pJrnl, &szJ)). 
d0d0: 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c    || szJ<16.   |
d0e0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d0f0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
d100: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65  rnl, szJ-16, &le
d110: 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e  n)).   || len>=n
d120: 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65  Master .   || le
d130: 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49  n==0 .   || SQLI
d140: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
d150: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
d160: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
d170: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d180: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d190: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
d1a0: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
d1b0: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
d1c0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
d1d0: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
d1e0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
d1f0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
d200: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
d210: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
d220: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
d230: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
d240: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
d250: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
d260: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
d270: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
d280: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
d290: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
d2a0: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
d2b0: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
d2c0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
d2d0: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
d2e0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
d2f0: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
d300: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
d310: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
d320: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
d330: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
d340: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
d350: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
d360: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
d370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
d380: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
d390: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
d3a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
d3b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
d3c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
d3d0: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
d3e0: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
d3f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d400: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
d410: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
d420: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
d430: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d440: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
d450: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
d460: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
d470: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
d480: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
d490: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
d4a0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
d4b0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
d4c0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
d4d0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
d4e0: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
d4f0: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
d500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d520: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
d590: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
d5a0: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
d5b0: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
d5c0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
d5d0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
d5e0: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
d5f0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
d600: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d610: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
d620: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
d630: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
d640: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
d650: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d660: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
d670: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
d680: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d690: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
d6a0: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
d6b0: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
d6c0: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
d6d0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
d6e0: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
d6f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
d700: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
d710: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
d720: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d730: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d740: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
d750: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
d760: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
d770: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
d780: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
d790: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
d7a0: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
d7b0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
d7c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
d7d0: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
d7e0: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
d7f0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
d800: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
d810: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
d820: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
d830: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
d840: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
d850: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
d860: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
d870: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
d880: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d890: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
d8a0: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
d8b0: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
d8c0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
d8d0: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
d8e0: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
d8f0: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
d900: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
d910: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
d920: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d930: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
d940: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
d950: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
d960: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
d970: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
d980: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
d990: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
d9a0: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
d9b0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
d9c0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
d9d0: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
d9e0: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
d9f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
da00: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
da10: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
da20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
da30: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
da40: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
da50: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
da60: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
da70: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
da80: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
da90: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
daa0: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
dab0: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
dac0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
dad0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
dae0: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
daf0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
db00: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
db10: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
db20: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
db50: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
db60: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
db70: 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  >jfd) );.  asser
db80: 74 28 20 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e  t( !sqlite3Journ
db90: 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
dba0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
dbb0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
dbc0: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
dbd0: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
dbe0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
dbf0: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
dc00: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
dc10: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
dc20: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
dc30: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
dc40: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
dc50: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
dc60: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
dc70: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
dc80: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
dc90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dca0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
dcb0: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
dcc0: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
dcd0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
dce0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
dcf0: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
dd00: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
dd10: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
dd20: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
dd30: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
dd40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dd50: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
dd60: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
dd70: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
dd80: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
dd90: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
dda0: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
ddb0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
ddc0: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
ddd0: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
dde0: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
ddf0: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
de00: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
de10: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
de20: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
de30: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
de40: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
de50: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
de60: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
de70: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
de80: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
de90: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
dea0: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
deb0: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
dec0: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
ded0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
dee0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
def0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
df00: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
df10: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
df20: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
df30: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
df40: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
df50: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
df60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
df70: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
df80: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
df90: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dfa0: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
dfb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dfc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dfd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
dfe0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
dff0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
e000: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e010: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
e020: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
e030: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
e040: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
e050: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e060: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
e070: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
e080: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
e090: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
e0a0: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
e0b0: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
e0c0: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
e0d0: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
e0e0: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
e0f0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
e100: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
e110: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
e120: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
e130: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
e140: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
e150: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
e160: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
e170: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
e180: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
e190: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
e1a0: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
e1b0: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
e1c0: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
e1d0: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
e1e0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
e1f0: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
e200: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e210: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
e220: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
e230: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
e240: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
e250: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
e260: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e280: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
e290: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
e2a0: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
e2b0: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
e2c0: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
e2d0: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
e2e0: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
e2f0: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
e300: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
e310: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
e320: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
e330: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
e340: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
e350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e360: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
e370: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
e380: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e3b0: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
e3c0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e3d0: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
e3e0: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
e3f0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
e400: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
e410: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
e420: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
e430: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
e440: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e450: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e460: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
e470: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
e480: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
e490: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
e4a0: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
e4b0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
e4c0: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
e4d0: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
e4e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
e4f0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
e500: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
e510: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
e520: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e530: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e540: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e550: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e560: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e570: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e580: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e590: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e5a0: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e5b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e5c0: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e5d0: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e5e0: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e5f0: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e600: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e610: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e620: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e630: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e640: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e650: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e660: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e670: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e680: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e690: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e6a0: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e6b0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e6c0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e6d0: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e6e0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e6f0: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e700: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e710: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e720: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e730: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e740: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e750: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e760: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e770: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e780: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e790: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
e7a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
e7b0: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
e7c0: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
e7d0: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
e7e0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e7f0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
e800: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
e810: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
e820: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
e830: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
e840: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
e850: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
e860: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
e870: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
e880: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
e890: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
e8a0: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
e8b0: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
e8c0: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
e8d0: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
e8e0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
e8f0: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
e900: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
e910: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
e920: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
e930: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
e940: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
e950: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
e960: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
e970: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
e980: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
e990: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
e9a0: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
e9b0: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
e9c0: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
e9d0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
e9e0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e9f0: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
ea00: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
ea10: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
ea20: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
ea30: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ea40: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ea50: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
ea60: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
ea70: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
ea80: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
ea90: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
eaa0: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
eab0: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
eac0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
ead0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eae0: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
eaf0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
eb00: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
eb10: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
eb20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
eb30: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
eb40: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
eb50: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
eb60: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
eb70: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
eb80: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
eb90: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
eba0: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
ebb0: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
ebc0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
ebd0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
ebe0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
ebf0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
ec00: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ec10: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
ec20: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
ec30: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
ec40: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ec50: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ec60: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
ec70: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
ec80: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
ec90: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
eca0: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
ecb0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ecc0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ecd0: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
ece0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
ecf0: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
ed00: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
ed10: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
ed20: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ed30: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
ed40: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
ed50: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
ed60: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
ed70: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
ed80: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
ed90: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
eda0: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
edb0: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
edc0: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
edd0: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
ede0: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
edf0: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
ee00: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
ee10: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
ee20: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
ee30: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
ee40: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
ee50: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ee60: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
ee70: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
ee80: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
ee90: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
eea0: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
eeb0: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
eec0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
eed0: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
eee0: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
eef0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
ef00: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
ef10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
ef20: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
ef30: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
ef40: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
ef50: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
ef60: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
ef70: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
ef80: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
ef90: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
efa0: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
efb0: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
efc0: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
efd0: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
efe0: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
eff0: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
f000: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
f010: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
f020: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
f030: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
f040: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
f050: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
f060: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
f070: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
f080: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
f090: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
f0a0: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
f0b0: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
f0c0: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
f0d0: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
f0e0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
f0f0: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
f100: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
f110: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
f120: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
f130: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
f140: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
f150: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
f160: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
f170: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
f180: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
f190: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
f1a0: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
f1b0: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
f1c0: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
f1d0: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
f1e0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
f1f0: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
f200: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
f210: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
f220: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
f230: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
f240: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
f250: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
f260: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
f270: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
f280: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
f290: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
f2a0: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
f2b0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
f2c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f2d0: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
f2e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
f2f0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
f300: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
f310: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
f320: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
f330: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f340: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
f350: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
f360: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
f370: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
f380: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
f390: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f3a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
f3b0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
f3c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
f3d0: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
f3e0: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
f3f0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
f400: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
f410: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f420: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f430: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
f440: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f450: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
f460: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
f470: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
f480: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
f490: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
f4a0: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
f4b0: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
f4c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
f4d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f4e0: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
f4f0: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
f500: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
f510: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
f520: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f530: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f540: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f550: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f560: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f570: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f580: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f590: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f5a0: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f5b0: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f5c0: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f5d0: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f5e0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f5f0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f600: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f610: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f620: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f630: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f640: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f650: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f660: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f670: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f680: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f690: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f6a0: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f6b0: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f6c0: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f6d0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f6e0: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f6f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f700: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f710: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f720: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f740: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f750: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f760: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f780: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f790: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f7a0: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
f7b0: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
f7c0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f7d0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f7e0: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
f7f0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f810: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
f820: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f830: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
f840: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
f870: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
f880: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
f890: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
f8a0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
f8b0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
f8c0: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
f8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f8e0: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
f8f0: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
f900: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
f910: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
f920: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
f930: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
f940: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
f950: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
f960: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
f970: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
f980: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
f990: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
f9a0: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
f9b0: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
f9c0: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
f9d0: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
f9e0: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
f9f0: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
fa00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fa10: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
fa20: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
fa30: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
fa40: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
fa50: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
fa60: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
fa70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fa80: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
fa90: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
faa0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
fab0: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
fac0: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
fad0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fae0: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
faf0: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
fb00: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
fb10: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
fb20: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
fb30: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
fb40: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
fb50: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
fb60: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
fb70: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
fb80: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
fb90: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
fba0: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
fbb0: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
fbc0: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
fbd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
fbe0: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
fbf0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
fc00: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
fc10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
fc20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fc30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fc40: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
fc50: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
fc60: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
fc70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
fc80: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
fc90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
fca0: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
fcb0: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
fcc0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fcd0: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
fce0: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
fcf0: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
fd00: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
fd10: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
fd20: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
fd30: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fd40: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
fd50: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
fd60: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
fd70: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
fd80: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fd90: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fda0: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
fdb0: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
fdc0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fdd0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fde0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
fdf0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
fe00: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
fe10: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fe20: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fe30: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
fe40: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
fe50: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fe60: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
fe70: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
fe80: 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
fe90: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
fea0: 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
feb0: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
fec0: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
fed0: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fef0: 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
ff00: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
ff10: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
ff20: 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
ff30: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
ff40: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
ff50: 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
ff60: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
ff70: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
ff80: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
ff90: 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
ffa0: 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
ffb0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ffc0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
ffd0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
ffe0: 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
fff0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
10000 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10010 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
10020 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
10030 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
10040 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
10050 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
10060 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
10070 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
10080 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
10090 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
100a0 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
100b0 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
100c0 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
100d0 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
100e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
100f0 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
10100 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
10110 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
10120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
10130 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
10140 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
10150 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
10160 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
10170 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
10180 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
10190 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
101a0 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
101b0 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
101c0 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
101d0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
101e0 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
101f0 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
10200 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
10210 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
10220 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
10230 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
10240 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
10250 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
10260 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
10270 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
10280 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
10290 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
102a0 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
102b0 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
102c0 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
102d0 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
102e0 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
102f0 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
10300 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
10310 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
10320 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
10330 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
10340 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
10350 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
10360 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
10370 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
10380 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
10390 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
103a0 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
103b0 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
103c0 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
103d0 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
103e0 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
103f0 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
10400 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10410 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
10420 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10430 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
10440 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
10450 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
10460 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
10470 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
10480 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
10490 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
104a0 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
104b0 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
104c0 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
104d0 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
104e0 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
104f0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
10500 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10510 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
10520 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
10530 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
10540 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
10550 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
10560 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
10570 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10580 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10590 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
105a0 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
105b0 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
105c0 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
105d0 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
105e0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
105f0 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
10600 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
10610 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
10620 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
10630 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
10640 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
10650 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
10660 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
10670 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10680 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10690 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
106a0 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
106b0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
106c0 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
106d0 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
106e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
106f0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
10700 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
10710 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
10720 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
10730 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10740 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
10750 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
10760 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
10770 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10780 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10790 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
107a0 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
107b0 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
107c0 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
107d0 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
107e0 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
107f0 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
10800 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10810 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
10820 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
10830 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
10840 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
10850 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
10860 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
10870 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10880 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10890 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
108a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
108b0 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
108c0 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
108d0 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
108e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
108f0 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
10900 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
10910 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10920 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
10930 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
10940 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
10950 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
10960 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
10970 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10980 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10990 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
109a0 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
109b0 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
109c0 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
109d0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
109e0 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
109f0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
10a00 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
10a10 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
10a20 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
10a30 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
10a40 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
10a50 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
10a60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
10a70 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10a80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10a90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10aa0 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10ad0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
10ae0 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b00 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
10b10 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
10b20 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
10b50 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
10b60 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
10b70 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10b90 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10ba0 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10bb0 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
10be0 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10bf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10c00 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
10c10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
10c20 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
10c30 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
10c40 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
10c50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
10c60 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
10c70 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10c80 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
10c90 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20  ->jfd).  ){.    
10ca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10cb0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10cc0 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20  setMaster = 1;. 
10cd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10ce0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
10cf0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10d00 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
10d10 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
10d20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
10d30 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
10d40 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
10d50 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
10d60 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
10d70 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
10d80 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
10d90 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
10da0 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
10db0 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
10dc0 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
10dd0 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
10de0 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
10df0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10e00 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
10e10 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
10e20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
10e30 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
10e40 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10e50 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
10e60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
10e70 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
10e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10e90 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
10ea0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
10eb0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
10ec0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
10ed0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
10ee0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
10ef0 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
10f00 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
10f10 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
10f20 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
10f30 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
10f40 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
10f50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
10f60 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
10f70 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10f80 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
10f90 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
10fa0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
10fb0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
10fc0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
10fd0 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
10fe0 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
10ff0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11000 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
11010 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
11020 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
11030 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
11040 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
11050 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
11060 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
11070 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
11080 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
11090 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
110a0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
110b0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
110c0 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d      iHdrOff+4+nM
110f0 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a  aster+8))).  ){.
11100 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11110 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
11120 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73  rnalOff += (nMas
11130 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49  ter+20);..  /* I
11140 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11150 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
11160 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
11170 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
11180 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
11190 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
111a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
111b0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
111c0 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
111d0 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
111e0 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
111f0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
11200 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
11210 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
11220 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
11230 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
11240 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
11250 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
11260 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11270 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
11280 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
11290 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
112a0 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
112b0 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
112c0 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
112d0 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
112e0 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
112f0 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
11300 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
11310 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
11320 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
11330 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ==(rc = sqlite3O
11340 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
11350 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65  ->jfd, &jrnlSize
11360 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a  )).   && jrnlSiz
11370 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e>pPager->journa
11380 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63  lOff.  ){.    rc
11390 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
113a0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
113b0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
113c0 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
113d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
113e0 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
113f0 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
11400 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
11410 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
11420 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
11430 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
11440 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69  er){.  pPager->i
11450 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20  DataVersion++;. 
11460 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
11470 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
11480 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65  ackup);.  sqlite
11490 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61  3PcacheClear(pPa
114a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
114b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
114c0 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  he pPager->iData
114d0 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f  Version value.*/
114e0 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61 67 65  .u32 sqlite3Page
114f0 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67  rDataVersion(Pag
11500 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
11510 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
11520 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
11530 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
11540 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
11550 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  n;.}../*.** Free
11560 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11570 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
11580 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
11590 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
115a0 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
115b0 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
115c0 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
115d0 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
115e0 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
115f0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
11600 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11610 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
11620 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
11630 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
11640 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11650 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11670 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
11680 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
11690 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
116a0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
116b0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
116c0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
116d0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
116e0 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
116f0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
11700 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
11710 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
11720 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
11730 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
11740 6f 72 79 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ory(pPager->sjfd
11750 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11760 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
11770 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
11780 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
11790 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
117a0 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
117b0 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
117c0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
117d0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
117e0 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
117f0 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
11800 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
11810 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
11820 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
11830 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
11840 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
11850 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
11860 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
11870 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
11880 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
11890 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
118a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
118b0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
118c0 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
118d0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
118e0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
118f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11900 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11910 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11920 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
11930 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
11940 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
11950 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
11960 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
11970 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
11980 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11990 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
119a0 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
119b0 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
119c0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
119d0 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
119e0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
119f0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
11a00 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
11a10 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
11a20 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
11a30 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
11a40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11a50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
11a70 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61   no-op if the pa
11a80 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11a90 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74  ive mode and not
11aa0 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52  .** in the ERROR
11ab0 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
11ac0 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74  e, it switches t
11ad0 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45  he pager to PAGE
11ae0 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e  R_OPEN.** state.
11af0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
11b00 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11b10 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
11b20 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ode, the databas
11b30 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d  e file is.** com
11b40 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64  pletely unlocked
11b50 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  . If the file is
11b60 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68   unlocked and th
11b70 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f  e file-system do
11b80 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69  es.** not exhibi
11b90 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c  t the UNDELETABL
11ba0 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70  E_WHEN_OPEN prop
11bb0 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61  erty, the journa
11bc0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f  l file is.** clo
11bd0 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70  sed (if it is op
11be0 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  en)..**.** If th
11bf0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52  e pager is in ER
11c00 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
11c10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11c20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20  called, the .** 
11c30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11c40 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20  pager cache are 
11c50 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65  discarded before
11c60 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20   switching back 
11c70 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20  to .** the OPEN 
11c80 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73  state. Regardles
11c90 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
11ca0 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
11cb0 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f  lusive-mode.** o
11cc0 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e  r not, any journ
11cd0 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20  al file left in 
11ce0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
11cf0 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a  will be treated.
11d00 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ** as a hot-jour
11d10 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
11d20 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ack the next tim
11d30 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  e a read-transac
11d40 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  tion.** is opene
11d50 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79  d (by this or by
11d60 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65   any other conne
11d70 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69  ction)..*/.stati
11d80 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
11d90 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
11da0 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  r){..  assert( p
11db0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11dc0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20  AGER_READER .   
11dd0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
11de0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
11df0 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  N .       || pPa
11e00 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11e10 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a  ER_ERROR .  );..
11e20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
11e30 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
11e40 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
11e50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
11e60 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41   = 0;.  releaseA
11e70 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
11e80 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ger);..  if( pag
11e90 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
11ea0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
11eb0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
11ec0 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  jfd) );.    sqli
11ed0 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
11ee0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
11ef0 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  >pWal);.    pPag
11f00 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
11f10 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65  ER_OPEN;.  }else
11f20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
11f30 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
11f40 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72   /* Error code r
11f70 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65 72  eturned by pager
11f80 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20  UnlockDb() */.  
11f90 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70    int iDc = isOp
11fa0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73  en(pPager->fd)?s
11fb0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
11fc0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
11fd0 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20  ager->fd):0;..  
11fe0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72    /* If the oper
11ff0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70  ating system sup
12000 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66  port deletion of
12010 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65   open files, the
12020 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74  n.    ** close t
12030 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12040 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
12050 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
12060 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20    Otherwise.    
12070 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  ** another conne
12080 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
12090 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
120a0 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20  ight delete the 
120b0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20  file.    ** out 
120c0 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
120d0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
120e0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
120f0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20  MODE_MEMORY   & 
12100 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
12110 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12120 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
12130 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
12140 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12150 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
12160 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
12170 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12180 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
12190 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29  LETE   & 5)!=1 )
121a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
121b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
121c0 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d  _TRUNCATE & 5)==
121d0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
121e0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
121f0 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35  ODE_PERSIST  & 5
12200 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  )==1 );.    if( 
12210 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45  0==(iDc & SQLITE
12220 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
12230 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20  LE_WHEN_OPEN).  
12240 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72     || 1!=(pPager
12250 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20  ->journalMode & 
12260 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  5).    ){.      
12270 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
12280 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
12290 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
122a0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
122b0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
122c0 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  d the call to un
122d0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
122e0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61  e.    ** file fa
122f0 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75 72  ils, set the cur
12300 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b  rent lock to UNK
12310 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
12320 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a  he comment.    *
12330 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  * above the #def
12340 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f  ine for UNKNOWN_
12350 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
12360 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74  anation of why t
12370 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65  his.    ** is ne
12380 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
12390 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e      rc = pagerUn
123a0 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e  lockDb(pPager, N
123b0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  O_LOCK);.    if(
123c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
123d0 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
123e0 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b  ==PAGER_ERROR ){
123f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
12400 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c  Lock = UNKNOWN_L
12410 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OCK;.    }..    
12420 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74 61  /* The pager sta
12430 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65  te may be change
12440 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52  d from PAGER_ERR
12450 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e  OR to PAGER_OPEN
12460 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74   here.    ** wit
12470 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68  hout clearing th
12480 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
12490 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61  is is intentiona
124a0 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20  l - the error.  
124b0 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65    ** code is cle
124c0 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61 63  ared and the cac
124d0 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65 20  he reset in the 
124e0 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20  block below..   
124f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12500 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12510 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
12520 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
12530 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
12540 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
12550 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
12560 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12570 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EN;.  }..  /* If
12580 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
12590 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
125a0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
125b0 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
125c0 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e  .  ** trusted. N
125d0 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61 72  ow that there ar
125e0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
125f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
12600 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69  he pager,.  ** i
12610 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76  t can safely mov
12620 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  e back to PAGER_
12630 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73  OPEN state. This
12640 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68   happens in both
12650 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64  .  ** normal and
12660 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69   exclusive-locki
12670 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng mode..  */.  
12680 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12690 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
126a0 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
126b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
126c0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  rCode ){.    if(
126d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
126e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61  e==0 ){.      pa
126f0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
12700 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
12710 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
12720 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
12730 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12740 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c  ER_OPEN;.    }el
12750 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
12760 2d 3e 65 53 74 61 74 65 20 3d 20 28 69 73 4f 70  ->eState = (isOp
12770 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
12780 3f 20 50 41 47 45 52 5f 4f 50 45 4e 20 3a 20 50  ? PAGER_OPEN : P
12790 41 47 45 52 5f 52 45 41 44 45 52 29 3b 0a 20 20  AGER_READER);.  
127a0 20 20 7d 0a 20 20 20 20 69 66 28 20 55 53 45 46    }.    if( USEF
127b0 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73  ETCH(pPager) ) s
127c0 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
127d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30  pPager->fd, 0, 0
127e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
127f0 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
12800 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  OK;.  }..  pPage
12810 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
12820 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
12830 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70  rnalHdr = 0;.  p
12840 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
12850 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
12860 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12870 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
12880 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c  an IOERR or FULL
12890 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75   error that requ
128a0 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  ires.** the page
128b0 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20  r to transition 
128c0 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
128d0 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63  tate may ahve oc
128e0 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66  curred..** The f
128f0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
12900 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
12910 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
12920 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  e, the second .*
12930 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  * the error-code
12940 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
12950 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
12960 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54   API function. T
12970 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74  he .** value ret
12980 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
12990 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
129a0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
129b0 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
129c0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
129d0 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
129e0 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f  _FULL, SQLITE_IO
129f0 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ERR or one of th
12a00 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63  e.** IOERR sub-c
12a10 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20  odes, the pager 
12a20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52  enters the ERROR
12a30 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65   state and the e
12a40 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
12a50 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
12a60 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74  errCode. While t
12a70 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73  he pager remains
12a80 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
12a90 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f  ate,.** all majo
12aa0 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  r API calls on t
12ab0 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  he Pager will im
12ac0 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
12ad0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a   Pager.errCode..
12ae0 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20  **.** The ERROR 
12af0 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20  state indicates 
12b00 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
12b10 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
12b20 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  ache .** cannot 
12b30 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73  be trusted. This
12b40 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c   state can be cl
12b50 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74  eared by complet
12b60 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a  ely discarding .
12b70 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
12b80 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
12b90 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  he. If a transac
12ba0 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20  tion was active 
12bb0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73  when.** the pers
12bc0 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63  istent error occ
12bd0 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
12be0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
12bf0 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
12c00 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72  be replayed to r
12c10 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65  estore the conte
12c20 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
12c30 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a  ase file (as if.
12c40 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74  ** it were a hot
12c50 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74  -journal)..*/.st
12c60 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
12c70 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
12c80 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
12c90 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
12ca0 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ff;.  assert( rc
12cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
12cc0 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
12cd0 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
12ce0 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12cf0 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
12d00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12d10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
12d20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
12d30 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
12d40 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
12d50 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c  ;.  if( rc2==SQL
12d60 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d  ITE_FULL || rc2=
12d70 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
12d80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
12d90 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70  Code = rc;.    p
12da0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12db0 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d  PAGER_ERROR;.  }
12dc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
12de0 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
12df0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
12e00 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  Page);../*.** Th
12e10 65 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  e write transact
12e20 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ion open on the 
12e30 70 61 67 65 72 20 70 61 73 73 65 64 20 61 73 20  pager passed as 
12e40 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
12e50 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 63 6f  t is.** being co
12e60 6d 6d 69 74 74 65 64 2e 20 54 68 69 73 20 66 75  mmitted. This fu
12e70 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
12e80 72 75 65 20 69 66 20 61 6c 6c 20 64 69 72 74 79  rue if all dirty
12e90 20 70 61 67 65 73 20 73 68 6f 75 6c 64 0a 2a 2a   pages should.**
12ea0 20 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64   be flushed to d
12eb0 69 73 6b 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  isk, or false ot
12ec0 68 65 72 77 69 73 65 2e 20 50 61 67 65 73 20 73  herwise. Pages s
12ed0 68 6f 75 6c 64 20 62 65 20 66 6c 75 73 68 65 64  hould be flushed
12ee0 20 74 6f 20 64 69 73 6b 0a 2a 2a 20 75 6e 6c 65   to disk.** unle
12ef0 73 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  ss one of the fo
12f00 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
12f10 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  .**.**   * The d
12f20 62 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  b is an in-memor
12f30 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
12f40 2a 20 20 20 2a 20 54 68 65 20 64 62 20 69 73 20  *   * The db is 
12f50 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
12f60 62 61 73 65 20 61 6e 64 20 74 68 65 20 64 62 20  base and the db 
12f70 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
12f80 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  n opened..**.** 
12f90 20 20 2a 20 54 68 65 20 64 62 20 69 73 20 61 20    * The db is a 
12fa0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
12fb0 73 65 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  se and the cache
12fc0 20 63 6f 6e 74 61 69 6e 73 20 6c 65 73 73 20 74   contains less t
12fd0 68 61 6e 0a 2a 2a 20 20 20 20 20 43 2f 34 20 64  han.**     C/4 d
12fe0 69 72 74 79 20 70 61 67 65 73 2c 20 77 68 65 72  irty pages, wher
12ff0 65 20 43 20 69 73 20 74 68 65 20 63 6f 6e 66 69  e C is the confi
13000 67 75 72 65 64 20 63 61 63 68 65 2d 73 69 7a 65  gured cache-size
13010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13020 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d  pagerFlushOnComm
13030 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
13040 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
13050 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72  >tempFile==0 ) r
13060 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21  eturn 1;.  if( !
13070 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
13080 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  d) ) return 0;. 
13090 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33   return (sqlite3
130a0 50 43 61 63 68 65 50 65 72 63 65 6e 74 44 69 72  PCachePercentDir
130b0 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
130c0 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a  he)>=25);.}../*.
130d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
130e0 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
130f0 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f  on. A transactio
13100 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64  n is usually end
13110 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72  ed by .** either
13120 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
13130 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f  OLLBACK operatio
13140 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
13150 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a  may be called .*
13160 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  * after rollback
13170 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
13180 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
13190 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  r occurs while o
131a0 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f  pening.** the jo
131b0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  urnal file or wr
131c0 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66  iting the very f
131d0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
131e0 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61  der of a.** data
131f0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
13200 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
13210 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
13220 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45  alled in PAGER_E
13230 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69  RROR state. If i
13240 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69  t is called.** i
13250 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20  n PAGER_NONE or 
13260 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
13270 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  te and the lock 
13280 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20  held is less.** 
13290 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61  exclusive than a
132a0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
132b0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
132c0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
132d0 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65 70  any active savep
132e0 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73  oints are releas
132f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
13300 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
13310 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69   open, then it i
13320 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f  s "finalized". O
13330 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a  nce a journal .*
13340 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  * file has been 
13350 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20  finalized it is 
13360 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
13370 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62  use it to roll b
13380 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61  ack a .** transa
13390 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20  ction. Nor will 
133a0 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  it be considered
133b0 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75   to be a hot-jou
133c0 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20  rnal by this.** 
133d0 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74  or any other dat
133e0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
133f0 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20  . Exactly how a 
13400 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
13410 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20  ized.** depends 
13420 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
13430 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  t the pager is r
13440 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
13450 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20  ive mode and.** 
13460 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72  the current jour
13470 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e  nal-mode (Pager.
13480 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75  journalMode valu
13490 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  e), as follows:.
134a0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
134b0 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20  ode==MEMORY.**  
134c0 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
134d0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69  descriptor is si
134e0 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69  mply closed. Thi
134f0 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a  s destroys an .*
13500 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20  *     in-memory 
13510 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20  journal..**.**  
13520 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52   journalMode==TR
13530 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f  UNCATE.**     Jo
13540 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72  urnal file is tr
13550 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
13560 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
13570 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13580 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20  de==PERSIST.**  
13590 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38 20     The first 28 
135a0 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
135b0 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65  rnal file are ze
135c0 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c  roed. This inval
135d0 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68  idates.**     th
135e0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
135f0 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66 69  header in the fi
13600 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68  le, and hence th
13610 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
13620 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e  .**     file. An
13630 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c   invalid journal
13640 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20   file cannot be 
13650 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
13660 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
13670 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20  ==DELETE.**     
13680 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
13690 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   is closed and d
136a0 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c  eleted using sql
136b0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
136c0 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65  **.**     If the
136d0 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
136e0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
136f0 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64  ode, this method
13700 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a   of finalizing.*
13710 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
13720 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20  l file is never 
13730 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69  used. Instead, i
13740 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64  f the journalMod
13750 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45  e is.**     DELE
13760 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  TE and the pager
13770 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
13780 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f   mode, the metho
13790 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65  d described unde
137a0 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c  r.**     journal
137b0 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73  Mode==PERSIST is
137c0 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
137d0 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a  *.** After the j
137e0 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69  ournal is finali
137f0 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d  zed, the pager m
13800 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45  oves to PAGER_RE
13810 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49  ADER state..** I
13820 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
13830 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62  -exclusive rollb
13840 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ack mode, the lo
13850 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  ck on the file i
13860 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64  s .** downgraded
13870 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43   to a SHARED_LOC
13880 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
13890 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
138a0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
138b0 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  s. If an error o
138c0 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20  ccurs during.** 
138d0 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70  any of the IO op
138e0 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61  erations to fina
138f0 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
13900 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20   file or unlock 
13910 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
13920 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
13930 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
13940 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20  ed to the user. 
13950 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61  If the .** opera
13960 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65  tion to finalize
13970 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13980 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  e fails, then th
13990 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20  e code still.** 
139a0 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  tries to unlock 
139b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
139c0 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c  e if not in excl
139d0 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74  usive mode. If t
139e0 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65  he.** unlock ope
139f0 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20  ration fails as 
13a00 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66  well, then the f
13a10 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20  irst error code 
13a20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  related.** to th
13a30 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e  e first error en
13a40 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a  countered (the j
13a50 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
13a60 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72  ion one) is.** r
13a70 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
13a80 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
13a90 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
13aa0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
13ab0 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62  hasMaster, int b
13ac0 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72  Commit){.  int r
13ad0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13ae0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13af0 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
13b00 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
13b10 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
13b20 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
13b30 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13b40 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
13b50 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
13b60 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  */..  /* Do noth
13b70 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72  ing if the pager
13b80 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
13b90 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
13ba0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72  nsaction.  ** or
13bb0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
13bc0 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20  RVED lock. This 
13bd0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
13be0 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
13bf0 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69  e.  ** is no wri
13c00 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
13c10 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45  ctive but a RESE
13c20 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
13c30 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c  lock is.  ** hel
13c40 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63  d under two circ
13c50 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a  umstances:.  **.
13c60 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20    **   1. After 
13c70 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74  a successful hot
13c80 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
13c90 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20  k, it is called 
13ca0 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65  with.  **      e
13cb0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
13cc0 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43  E and eLock==EXC
13cd0 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a  LUSIVE_LOCK..  *
13ce0 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61  *.  **   2. If a
13cf0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
13d00 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
13d10 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20  clusive holding 
13d20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  an EXCLUSIVE .  
13d30 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69  **      lock swi
13d40 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f  tches back to lo
13d50 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
13d60 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75  l and then execu
13d70 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20  tes a.  **      
13d80 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
13d90 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
13da0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65  is called with e
13db0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
13dc0 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61  DER .  **      a
13dd0 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
13de0 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  IVE_LOCK when th
13df0 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
13e00 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20  on is closed..  
13e10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  */.  assert( ass
13e20 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
13e30 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
13e40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
13e50 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
13e60 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
13e70 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
13e80 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20  RITER_LOCKED && 
13e90 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45  pPager->eLock<RE
13ea0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
13eb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13ec0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65  _OK;.  }..  rele
13ed0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
13ee0 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
13ef0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
13f00 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
13f10 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
13f20 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
13f30 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
13f40 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
13f50 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13f60 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
13f70 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
13f80 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
13f90 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
13fa0 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67  lIsInMemory(pPag
13fb0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
13fc0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 61    /* assert( pPa
13fd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13fe0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13ff0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f  ODE_MEMORY ); */
14000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
14010 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
14020 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
14030 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14040 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14050 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
14060 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
14070 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14080 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
14090 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
140a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
140b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
140c0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
140d0 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
140e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
140f0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
14100 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
14110 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
14120 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69 6c  sure the new fil
14130 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74 65  e size is writte
14140 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65  n into the inode
14150 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
14160 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
14170 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ise the journal 
14180 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74 20  might resurrect 
14190 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
141a0 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20 20  r loss and.     
141b0 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
141c0 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74 69  e last transacti
141d0 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e  on to roll back.
141e0 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20 20    See.          
141f0 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69  ** https://bugzi
14200 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f  lla.mozilla.org/
14210 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d  show_bug.cgi?id=
14220 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20 20  1072773.        
14230 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
14240 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
14250 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
14260 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
14270 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14280 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
14290 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
142a0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
142b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
142c0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
142d0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
142e0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
142f0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
14300 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
14310 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
14320 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20  URNALMODE_WAL). 
14330 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
14340 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
14350 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
14360 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  r||pPager->tempF
14370 69 6c 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ile);.      pPag
14380 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14390 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
143a0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
143b0 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
143c0 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
143d0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
143e0 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
143f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
14400 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
14410 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
14420 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
14430 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
14440 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
14450 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
14460 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
14470 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
14480 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
14490 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
144a0 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
144b0 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20  y journal..     
144c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
144d0 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72 2d  elete = !pPager-
144e0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20  >tempFile;.     
144f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14500 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
14510 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d  y(pPager->jfd)==
14520 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
14530 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
14540 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14550 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
14560 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
14570 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14580 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14590 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
145a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
145b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
145c0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
145d0 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
145e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
145f0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
14600 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  fd);.      if( b
14610 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
14620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14630 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
14640 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
14650 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65  urnal, pPager->e
14660 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20 20 20  xtraSync);.     
14670 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
14680 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
14690 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65  K_PAGES.  sqlite
146a0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
146b0 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
146c0 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
146d0 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20  agehash);.  if( 
146e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
146f0 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63  0 && sqlite3Pcac
14700 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
14710 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
14720 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
14730 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
14740 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  up(pPager, 1);. 
14750 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
14760 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20    p->pageHash = 
14770 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
14780 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
14790 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  l(p);.    }.  }.
147a0 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
147b0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
147c0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
147d0 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
147e0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
147f0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
14800 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
14810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
14820 20 4d 45 4d 44 42 20 7c 7c 20 70 61 67 65 72 46   MEMDB || pagerF
14830 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 70 50 61  lushOnCommit(pPa
14840 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ger) ){.      sq
14850 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
14860 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
14870 63 68 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  che);.    }else{
14880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
14890 61 63 68 65 43 6c 65 61 72 57 72 69 74 61 62 6c  acheClearWritabl
148a0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
148b0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
148c0 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
148d0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
148e0 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
148f0 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ize);.  }..  if(
14900 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
14910 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44  ger) ){.    /* D
14920 72 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74  rop the WAL writ
14930 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20  e-lock, if any. 
14940 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e  Also, if the con
14950 6e 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a  nection was in .
14960 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d      ** locking_m
14970 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
14980 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e  de but is no lon
14990 67 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58  ger, drop the EX
149a0 43 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20  CLUSIVE .    ** 
149b0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
149c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
149d0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d      */.    rc2 =
149e0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72   sqlite3WalEndWr
149f0 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  iteTransaction(p
14a00 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
14a10 20 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53    assert( rc2==S
14a20 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65  QLITE_OK );.  }e
14a30 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
14a40 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74  TE_OK && bCommit
14a50 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69   && pPager->dbFi
14a60 6c 65 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64  leSize>pPager->d
14a70 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  bSize ){.    /* 
14a80 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
14a90 61 6b 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74  aken when commit
14aa0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
14ab0 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a  on in rollback-j
14ac0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f  ournal.    ** mo
14ad0 64 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  de if the databa
14ae0 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  se file on disk 
14af0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
14b00 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
14b10 65 2e 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69  e..    ** At thi
14b20 73 20 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72  s point the jour
14b30 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e  nal has been fin
14b40 61 6c 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74  alized and the t
14b50 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
14b60 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
14b70 63 6f 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74  committed, but t
14b80 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
14b90 6b 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20  k is still held 
14ba0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  on the.    ** fi
14bb0 6c 65 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66  le. So it is saf
14bc0 65 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  e to truncate th
14bd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14be0 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20  to its minimum. 
14bf0 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73     ** required s
14c00 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ize.  */.    ass
14c10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
14c20 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
14c30 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  CK );.    rc = p
14c40 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
14c50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62  ager, pPager->db
14c60 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Size);.  }..  if
14c70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14c80 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 73  && bCommit && is
14c90 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
14ca0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
14cb0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
14cc0 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
14cd0 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49  LITE_FCNTL_COMMI
14ce0 54 5f 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a  T_PHASETWO, 0);.
14cf0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14d00 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63  TE_NOTFOUND ) rc
14d10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14d20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
14d30 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
14d40 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73  .   && (!pagerUs
14d50 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20  eWal(pPager) || 
14d60 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
14d70 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
14d80 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20  pWal, 0)).  ){. 
14d90 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e     rc2 = pagerUn
14da0 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
14db0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
14dc0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
14dd0 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
14de0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  }.  pPager->eSta
14df0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
14e00 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  R;.  pPager->set
14e10 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72  Master = 0;..  r
14e20 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
14e30 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
14e40 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
14e50 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74   rollback if a t
14e60 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
14e70 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tive and unlock 
14e80 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
14e90 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
14ea0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
14eb0 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
14ec0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
14ed0 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a  do not attempt .
14ee0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
14ef0 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e  at this time. In
14f00 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c  stead, pager_unl
14f10 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ock() is called.
14f20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   The.** call to 
14f30 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
14f40 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20  ill discard all 
14f50 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c  in-memory pages,
14f60 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64   unlock.** the d
14f70 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
14f80 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20   move the pager 
14f90 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
14fa0 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20  te. If this .** 
14fb0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
14fc0 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
14fd0 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
14fe0 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
14ff0 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ext .** connecti
15000 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  on to obtain a s
15010 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
15020 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
15030 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
15040 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74  .** will roll it
15050 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
15060 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
15070 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
15080 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
15090 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
150a0 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
150b0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
150c0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
150d0 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
150e0 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
150f0 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
15100 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68   ERROR state. Wh
15110 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
15120 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
15130 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
15140 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
15150 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
15160 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
15170 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
15180 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15190 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
151a0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
151b0 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
151c0 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
151d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  ){.    assert( a
151e0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
151f0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  e(pPager) );.   
15200 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
15210 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
15220 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  R_LOCKED ){.    
15230 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
15240 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15250 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
15260 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
15270 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
15280 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
15290 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
152a0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
152b0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
152c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
152d0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
152e0 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61  ADER );.      pa
152f0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
15300 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30  ion(pPager, 0, 0
15310 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
15320 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
15330 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  er);.}../*.** Pa
15340 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75  rameter aData mu
15350 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
15360 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e  ffer of pPager->
15370 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a  pageSize bytes.*
15380 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75  * of data. Compu
15390 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
153a0 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  checksum based o
153b0 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nt the contents 
153c0 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
153d0 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  of data and the 
153e0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
153f0 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
15400 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  it..**.** This i
15410 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
15420 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61  cksum. It is rea
15430 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
15440 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
15450 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
15460 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   (pPager->cksumI
15470 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32  nit) and every 2
15480 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20  00th byte.** of 
15490 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73  the page data, s
154a0 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74  tarting with byt
154b0 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72  e offset (pPager
154c0 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e  ->pageSize%200).
154d0 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73  .** Each byte is
154e0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
154f0 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65  an 8-bit unsigne
15500 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  d integer..**.**
15510 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f   Changing the fo
15520 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f  rmula used to co
15530 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b  mpute this check
15540 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61  sum results in a
15550 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n.** incompatibl
15560 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
15570 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
15580 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69  journal corrupti
15590 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
155a0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
155b0 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
155c0 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69  y .** scenario i
155d0 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
155e0 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
155f0 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
15600 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  e changed. .** I
15610 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c  t is much less l
15620 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
15630 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
15640 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
15650 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
15660 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
15670 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
15680 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
15690 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
156a0 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
156b0 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
156c0 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
156d0 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
156e0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  on..*/.static u3
156f0 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
15700 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
15710 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
15720 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
15730 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20  ger->cksumInit; 
15740 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
15750 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74  sum value to ret
15760 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  urn */.  int i =
15770 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15780 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20  e-200;          
15790 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
157a0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  */.  while( i>0 
157b0 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
157c0 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
157d0 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
157e0 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
157f0 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20  *.** Report the 
15800 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a  current page siz
15810 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  e and number of 
15820 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62  reserved bytes b
15830 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  ack.** to the co
15840 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  dec..*/.#ifdef S
15850 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
15860 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
15870 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65  rReportSize(Page
15880 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
15890 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
158a0 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20  SizeChng ){.    
158b0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
158c0 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70  zeChng(pPager->p
158d0 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70  Codec, pPager->p
158e0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15900 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d      (int)pPager-
15910 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a  >nReserve);.  }.
15920 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
15930 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
15940 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70  (X)     /* No-op
15950 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75   if we do not su
15960 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f  pport a codec */
15970 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
15980 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
15990 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
159a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
159b0 65 73 65 72 76 65 64 20 62 69 74 73 20 69 73 20  eserved bits is 
159c0 74 68 65 20 73 61 6d 65 20 69 6e 20 74 68 65 20  the same in the 
159d0 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70  destination.** p
159e0 61 67 65 72 20 61 73 20 69 74 20 69 73 20 69 6e  ager as it is in
159f0 20 74 68 65 20 73 6f 75 72 63 65 2e 20 20 54 68   the source.  Th
15a00 69 73 20 63 6f 6d 65 73 20 75 70 20 77 68 65 6e  is comes up when
15a10 20 61 20 56 41 43 55 55 4d 20 63 68 61 6e 67 65   a VACUUM change
15a20 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
15a30 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73  of reserved bits
15a40 20 74 6f 20 74 68 65 20 22 6f 70 74 69 6d 61 6c   to the "optimal
15a50 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69  " amount..*/.voi
15a60 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 6c  d sqlite3PagerAl
15a70 69 67 6e 52 65 73 65 72 76 65 28 50 61 67 65 72  ignReserve(Pager
15a80 20 2a 70 44 65 73 74 2c 20 50 61 67 65 72 20 2a   *pDest, Pager *
15a90 70 53 72 63 29 7b 0a 20 20 69 66 28 20 70 44 65  pSrc){.  if( pDe
15aa0 73 74 2d 3e 6e 52 65 73 65 72 76 65 21 3d 70 53  st->nReserve!=pS
15ab0 72 63 2d 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a  rc->nReserve ){.
15ac0 20 20 20 20 70 44 65 73 74 2d 3e 6e 52 65 73 65      pDest->nRese
15ad0 72 76 65 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73  rve = pSrc->nRes
15ae0 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
15af0 65 70 6f 72 74 53 69 7a 65 28 70 44 65 73 74 29  eportSize(pDest)
15b00 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
15b10 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
15b20 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69  gle page from ei
15b30 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
15b40 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e   file (if isMain
15b50 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66  Jrnl==1) or.** f
15b60 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
15b70 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  nal (if isMainJr
15b80 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62  nl==0) and playb
15b90 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a  ack that page..*
15ba0 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e  * The page begin
15bb0 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66  s at offset *pOf
15bc0 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
15bd0 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74  le. The *pOffset
15be0 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63  .** value is inc
15bf0 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74  reased to the st
15c00 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
15c10 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
15c20 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  nal..**.** The m
15c30 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
15c40 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73  rnal uses checks
15c50 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
15c60 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
15c70 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20   .** not..**.** 
15c80 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
15c90 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72  er of the page r
15ca0 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20  ecord read from 
15cb0 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
15cc0 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  l file.** is gre
15cd0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
15ce0 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
15cf0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65  ager.dbSize, the
15d00 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a  n playback is.**
15d10 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c   skipped and SQL
15d20 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
15d30 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f  ed..**.** If pDo
15d40 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ne is not NULL, 
15d50 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63  then it is a rec
15d60 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61  ord of pages tha
15d70 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  t have already.*
15d80 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  * been played ba
15d90 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ck.  If the page
15da0 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73   at *pOffset has
15db0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
15dc0 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66  ayed back.** (if
15dd0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
15de0 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20  ng pDone bit is 
15df0 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74  set) then skip t
15e00 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20  he playback..** 
15e10 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44  Make sure the pD
15e20 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  one bit correspo
15e30 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f  nding to the *pO
15e40 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65  ffset page is se
15e50 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65  t.** prior to re
15e60 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
15e70 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
15e80 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  d is successfull
15e90 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
15ea0 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
15eb0 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64  le.** and played
15ec0 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49   back, then SQLI
15ed0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
15ee0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
15ef0 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c  r occurs.** whil
15f00 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65  e reading the re
15f10 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73  cord from the (s
15f20 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15f30 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e   or while writin
15f40 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  g.** to the data
15f50 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
15f60 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
15f70 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
15f80 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63  f data.** is suc
15f90 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
15fa0 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
15fb0 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61  urnal file but a
15fc0 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20  ppears to be.** 
15fd0 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
15fe0 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
15ff0 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73  ed. Data is cons
16000 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64  idered corrupted
16010 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75   in.** two circu
16020 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a  mstances:.** .**
16030 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
16040 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  rd page-number i
16050 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20  s illegal (0 or 
16060 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20  PAGER_MJ_PGNO), 
16070 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  or.**   * If the
16080 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67   record is being
16090 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f   rolled back fro
160a0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
160b0 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61  al file.**     a
160c0 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
160d0 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d  field does not m
160e0 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20  atch the record 
160f0 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  content..**.** N
16100 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20  either of these 
16110 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72  two scenarios ar
16120 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e  e possible durin
16130 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  g a savepoint ro
16140 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
16150 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70   this is a savep
16160 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  oint rollback, t
16170 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68  hen memory may h
16180 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ave to be dynami
16190 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
161a0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
161b0 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  ion. If this is 
161c0 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20  the case and an 
161d0 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
161e0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ,.** SQLITE_NOME
161f0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  M is returned..*
16200 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
16210 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
16220 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
16230 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
16240 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
16250 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20  er being played 
16260 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70  back */.  i64 *p
16270 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
16280 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
16290 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
162a0 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74  layback */.  Bit
162b0 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20  vec *pDone,     
162c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
162d0 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
162e0 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63  ready played bac
162f0 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
16300 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
16310 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
16320 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
16330 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
16340 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20    int isSavepnt 
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16360 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61  /* True for a sa
16370 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
16380 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
16390 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
163c0 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
163d0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
163e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
163f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
16400 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
16410 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
16420 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
16450 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
16460 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
16470 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
16480 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
16490 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
164a0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
164b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
164c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
164d0 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
164e0 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
164f0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
16500 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20  t isSynced;     
16510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16520 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70  rue if journal p
16530 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  age is synced */
16540 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d  ..  assert( (isM
16550 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29  ainJrnl&~1)==0 )
16560 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e  ;      /* isMain
16570 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a  Jrnl is 0 or 1 *
16580 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53  /.  assert( (isS
16590 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b  avepnt&~1)==0 );
165a0 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65         /* isSave
165b0 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  pnt is 0 or 1 */
165c0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69  .  assert( isMai
165d0 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29  nJrnl || pDone )
165e0 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61  ;     /* pDone a
165f0 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75  lways used on su
16600 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
16610 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
16620 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b  t || pDone==0 );
16630 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65     /* pDone neve
16640 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61  r used on non-sa
16650 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44  vepoint */..  aD
16660 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ata = pPager->pT
16670 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
16680 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
16690 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
166a0 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
166b0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
166c0 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ated */.  assert
166d0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
166e0 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73  ager)==0 || (!is
166f0 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61  MainJrnl && isSa
16700 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20  vepnt) );..  /* 
16710 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65  Either the state
16720 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
16730 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
16740 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61  CHEMOD (a transa
16750 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73  ction .  ** or s
16760 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
16770 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65  k done at the re
16780 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c  quest of the cal
16790 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a  ler) or this is.
167a0 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
167b0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20  al rollback. If 
167c0 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  it is a hot-jour
167d0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  nal rollback, th
167e0 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20  e pager.  ** is 
167f0 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e  in state OPEN an
16800 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55  d holds an EXCLU
16810 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a  SIVE lock. Hot-j
16820 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a  ournal rollback.
16830 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20    ** only reads 
16840 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
16850 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73  urnal, not the s
16860 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  ub-journal..  */
16870 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16880 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
16890 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
168a0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
168b0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
168c0 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72  R_OPEN && pPager
168d0 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
168e0 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20  VE_LOCK).  );.  
168f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16900 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
16910 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c  ITER_CACHEMOD ||
16920 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a   isMainJrnl );..
16930 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
16940 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
16950 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
16960 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
16970 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
16980 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
16990 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
169a0 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
169b0 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
169c0 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
169d0 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
169e0 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
169f0 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
16a00 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
16a10 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
16a20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16a30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
16a40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
16a50 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74  d(jfd, (u8*)aDat
16a60 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
16a70 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
16a80 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
16a90 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
16aa0 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
16ab0 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
16ac0 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
16ad0 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
16ae0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
16af0 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
16b00 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
16b10 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
16b20 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
16b30 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
16b40 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
16b50 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
16b60 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
16b70 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
16b80 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
16b90 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
16ba0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
16bb0 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
16bc0 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
16bd0 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
16be0 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
16bf0 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
16c00 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
16c10 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
16c20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
16c30 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
16c40 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20  ert( !isSavepnt 
16c50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
16c60 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
16c70 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29   if( pgno>(Pgno)
16c80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
16c90 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
16ca0 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  est(pDone, pgno)
16cb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
16cc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
16cd0 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
16ce0 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
16cf0 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66  2bits(jfd, (*pOf
16d00 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29  fset)-4, &cksum)
16d10 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
16d20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
16d30 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
16d40 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
16d50 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21  er, (u8*)aData)!
16d60 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
16d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
16d80 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
16d90 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
16da0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
16db0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65  n played back be
16dc0 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20  fore during the 
16dd0 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  current.  ** rol
16de0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27  lback, then don'
16df0 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79  t bother to play
16e00 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a   it back again..
16e10 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65    */.  if( pDone
16e20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
16e30 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
16e40 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
16e50 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
16e60 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
16e70 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63  When playing bac
16e80 6b 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72  k page 1, restor
16e90 65 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73  e the nReserve s
16ea0 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66  etting.  */.  if
16eb0 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ( pgno==1 && pPa
16ec0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28  ger->nReserve!=(
16ed0 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20  (u8*)aData)[20] 
16ee0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
16ef0 52 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29  Reserve = ((u8*)
16f00 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20  aData)[20];.    
16f10 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
16f20 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
16f30 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
16f40 69 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73  is in CACHEMOD s
16f50 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
16f60 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
16f70 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
16f80 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
16f90 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
16fa0 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
16fb0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
16fc0 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
16fd0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
16fe0 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
16ff0 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
17000 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
17010 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
17020 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
17030 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
17040 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
17050 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
17060 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
17070 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
17080 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
17090 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
170a0 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
170b0 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
170c0 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
170d0 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
170e0 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
170f0 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
17100 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
17110 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
17120 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
17130 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
17140 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
17150 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
17160 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
17170 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
17180 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
17190 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c  in WRITER_DBMOD,
171a0 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
171b0 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
171c0 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
171d0 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61  he.  ** pager ca
171e0 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
171f0 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
17200 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
17210 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a  then marked .  *
17220 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e  * not dirty. Sin
17230 63 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  ce this code is 
17240 6f 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e  only executed in
17250 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
17260 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74  e for.  ** a hot
17270 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
17280 6b 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  k, it is guarant
17290 65 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  eed that the pag
172a0 65 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79  e-cache is empty
172b0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67  .  ** if the pag
172c0 65 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74  er is in OPEN st
172d0 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ate..  **.  ** T
172e0 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
172f0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
17300 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
17310 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
17320 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
17330 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
17340 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
17350 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
17360 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
17370 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
17380 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
17390 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
173a0 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
173b0 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
173c0 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
173d0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
173e0 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
173f0 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
17400 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
17410 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
17420 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
17430 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
17440 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
17450 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
17460 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
17470 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
17480 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
17490 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
174a0 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
174b0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
174c0 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
174d0 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
174e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
174f0 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
17500 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
17510 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
17520 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
17530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
17540 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
17550 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
17560 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
17570 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
17580 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
17590 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
175a0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
175b0 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
175c0 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
175d0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
175e0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
175f0 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
17600 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
17610 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
17620 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
17630 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
17640 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
17650 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
17660 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
17670 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
17680 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
17690 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
176a0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
176b0 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
176c0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
176d0 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
176e0 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
176f0 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
17700 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
17710 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
17720 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
17730 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
17740 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
17750 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
17760 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
17770 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
17780 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  se{.    pPg = sq
17790 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
177a0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
177b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
177c0 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
177d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
177e0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
177f0 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c  PEN || pPg==0 ||
17800 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
17810 65 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  e );.  PAGERTRAC
17820 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E(("PLAYBACK %d 
17830 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
17840 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  x) %s\n",.      
17850 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
17860 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
17870 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
17880 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38  r->pageSize, (u8
17890 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  *)aData),.      
178a0 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c       (isMainJrnl
178b0 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a  ?"main-journal":
178c0 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20  "sub-journal"). 
178d0 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69   ));.  if( isMai
178e0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53  nJrnl ){.    isS
178f0 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
17900 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66  noSync || (*pOff
17910 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  set <= pPager->j
17920 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65  ournalHdr);.  }e
17930 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  lse{.    isSynce
17940 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30  d = (pPg==0 || 0
17950 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  ==(pPg->flags & 
17960 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
17970 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f  );.  }.  if( isO
17980 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
17990 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
179a0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
179b0 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
179c0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
179d0 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69  ER_OPEN).   && i
179e0 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20  sSynced.  ){.   
179f0 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e   i64 ofst = (pgn
17a00 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
17a10 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
17a20 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76  testcase( !isSav
17a30 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26  epnt && pPg!=0 &
17a40 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  & (pPg->flags&PG
17a50 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
17a60 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17a70 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
17a80 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20  ager) );.    rc 
17a90 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
17aa0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
17ab0 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
17ac0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
17ad0 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  );.    if( pgno>
17ae0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
17af0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
17b00 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
17b10 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20   pgno;.    }.   
17b20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
17b30 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f  ckup ){.      CO
17b40 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61  DEC1(pPager, aDa
17b50 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  ta, pgno, 3, rc=
17b60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
17b70 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  T);.      sqlite
17b80 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
17b90 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
17ba0 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29  gno, (u8*)aData)
17bb0 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  ;.      CODEC2(p
17bc0 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
17bd0 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45  no, 7, rc=SQLITE
17be0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61 44 61  _NOMEM_BKPT, aDa
17bf0 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ta);.    }.  }el
17c00 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72  se if( !isMainJr
17c10 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a  nl && pPg==0 ){.
17c20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
17c30 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  s a rollback of 
17c40 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  a savepoint and 
17c50 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69  data was not wri
17c60 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74  tten to.    ** t
17c70 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
17c80 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
17c90 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65  in-memory, there
17ca0 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a   is a potential.
17cb0 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20      ** problem. 
17cc0 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  When the page is
17cd0 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79   next fetched by
17ce0 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
17cf0 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69  r, it .    ** wi
17d00 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ll be read from 
17d10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17d20 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20  e, which may or 
17d30 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  may not be .    
17d40 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20  ** current. .   
17d50 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65   **.    ** There
17d60 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66   are a couple of
17d70 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20   different ways 
17d80 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e  this can happen.
17d90 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20   All are quite. 
17da0 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57     ** obscure. W
17db0 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73  hen running in s
17dc0 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
17dd0 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   this can only h
17de0 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66  appen .    ** if
17df0 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20   the page is on 
17e00 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74  the free-list at
17e10 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
17e20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  e transaction, t
17e30 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c  hen.    ** popul
17e40 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64  ated, then moved
17e50 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61   using sqlite3Pa
17e60 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20  gerMovepage().. 
17e70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
17e80 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20   solution is to 
17e90 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  add an in-memory
17ea0 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63   page to the cac
17eb0 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20  he containing.  
17ec0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75    ** the data ju
17ed0 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  st read from the
17ee0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61   sub-journal. Ma
17ef0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
17f00 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64  irty .    ** and
17f10 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65   if the pager re
17f20 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c  quires a journal
17f30 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b  -sync, then mark
17f40 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20   the page as .  
17f50 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61    ** requiring a
17f60 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65   journal-sync be
17f70 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74  fore it is writt
17f80 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  en..    */.    a
17f90 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
17fa0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17fb0 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
17fc0 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
17fd0 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a  ROLLBACK)==0 );.
17fe0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
17ff0 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46  tSpill |= SPILLF
18000 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  LAG_ROLLBACK;.  
18010 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18020 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
18030 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20  gno, &pPg, 1);. 
18040 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
18050 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
18060 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
18070 41 43 4b 29 21 3d 30 20 29 3b 0a 20 20 20 20 70  ACK)!=0 );.    p
18080 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
18090 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f  l &= ~SPILLFLAG_
180a0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66  ROLLBACK;.    if
180b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
180c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
180d0 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e   pPg->flags &= ~
180e0 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b  PGHDR_NEED_READ;
180f0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
18100 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
18110 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  ;.  }.  if( pPg 
18120 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
18130 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
18140 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c   explicitly roll
18150 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20  ed back that is 
18160 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20  in use, except. 
18170 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31     ** for page 1
18180 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69   which is held i
18190 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
181a0 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20  o keep the lock 
181b0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
181c0 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48  tabase active. H
181d0 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61  owever such a pa
181e0 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64  ge may be rolled
181f0 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
18200 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69  t.    ** of an i
18210 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65  nternal error re
18220 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75  sulting in an au
18230 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a  tomatic call to.
18240 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61      ** sqlite3Pa
18250 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20  gerRollback().. 
18260 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a     */.    void *
18270 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61  pData;.    pData
18280 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
18290 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
182a0 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
182b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
182c0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
182d0 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
182e0 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  if( isMainJrnl &
182f0 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c  & (!isSavepnt ||
18300 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65   *pOffset<=pPage
18310 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29  r->journalHdr) )
18320 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
18330 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
18340 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75 73  is page were jus
18350 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20  t restored from 
18360 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20  the main .      
18370 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
18380 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e   then its conten
18390 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68 65  t must be as the
183a0 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65 20  y were when the 
183b0 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
183c0 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20  ction was first 
183d0 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  opened. In this 
183e0 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b  case we can mark
183f0 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
18400 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e  ** as clean, sin
18410 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65  ce there will be
18420 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74   no need to writ
18430 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 0a  e it out to the.
18440 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
18450 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
18460 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e    ** There is on
18470 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  e exception to t
18480 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65  his rule. If the
18490 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
184a0 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  olled.      ** b
184b0 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61  ack as part of a
184c0 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73   savepoint (or s
184d0 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61  tatement) rollba
184e0 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20  ck from an .    
184f0 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f    ** unsynced po
18500 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69  rtion of the mai
18510 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  n journal file, 
18520 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73  then it is not s
18530 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  afe.      ** to 
18540 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
18550 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20   clean. This is 
18560 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20  because marking 
18570 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20 20  the page as.    
18580 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20    ** clean will 
18590 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
185a0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20  NEED_SYNC flag. 
185b0 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20 69  Since the page i
185c0 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  s.      ** alrea
185d0 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
185e0 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64  l file (recorded
185f0 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
18600 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20  rnal) and.      
18610 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
18620 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63  D_SYNC flag is c
18630 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70  leared, if the p
18640 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  age is written t
18650 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  o.      ** again
18660 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
18670 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c  nsaction, it wil
18680 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  l be marked as d
18690 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a  irty but.      *
186a0 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  * the PGHDR_NEED
186b0 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20  _SYNC flag will 
186c0 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 63  not be set. It c
186d0 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74  ould then potent
186e0 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62  ially.      ** b
186f0 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e  e written out in
18700 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
18710 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20  file before its 
18720 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20  journal file.   
18730 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73     ** segment is
18740 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72   synced. If a cr
18750 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ash occurs durin
18760 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  g or following t
18770 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61  his,.      ** da
18780 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
18790 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20  n may ensue..   
187a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55     **.      ** U
187b0 70 64 61 74 65 3a 20 41 6e 6f 74 68 65 72 20 65  pdate: Another e
187c0 78 63 65 70 74 69 6f 6e 20 69 73 20 66 6f 72 20  xception is for 
187d0 74 65 6d 70 20 66 69 6c 65 73 20 74 68 61 74 20  temp files that 
187e0 61 72 65 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a  are not .      *
187f0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
18800 62 61 73 65 73 2e 20 49 6e 20 74 68 69 73 20 63  bases. In this c
18810 61 73 65 20 74 68 65 20 70 61 67 65 20 6d 61 79  ase the page may
18820 20 68 61 76 65 20 62 65 65 6e 20 64 69 72 74 79   have been dirty
18830 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
18840 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
18850 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
18860 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
18870 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
18880 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
18890 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
188a0 46 69 6c 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  File==0 ) sqlite
188b0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
188c0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
188d0 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
188e0 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f  ash(pPg);..    /
188f0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
18900 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
18910 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
18920 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
18930 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
18940 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
18950 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
18960 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
18970 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
18980 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
18990 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
189a0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
189b0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
189c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
189d0 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
189e0 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
189f0 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
18a00 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
18a10 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
18a20 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
18a30 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
18a40 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
18a50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
18a70 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
18a80 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
18a90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18aa0 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
18ab0 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
18ac0 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
18ad0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18ae0 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
18af0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
18b00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
18b10 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
18b20 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
18b30 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
18b40 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
18b50 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
18b60 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
18b70 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
18b80 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
18b90 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
18ba0 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
18bb0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
18bc0 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
18bd0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
18be0 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
18bf0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
18c00 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
18c10 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
18c20 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
18c30 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
18c40 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
18c50 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
18c60 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
18c70 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
18c80 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
18c90 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
18ca0 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
18cb0 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
18cc0 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
18cd0 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
18ce0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
18cf0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
18d00 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
18d10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
18d20 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
18d30 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
18d40 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
18d50 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
18d60 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
18d70 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
18d80 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
18d90 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
18da0 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
18db0 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
18dc0 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
18dd0 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
18de0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
18df0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
18e00 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
18e10 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
18e20 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
18e30 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
18e40 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
18e50 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
18e60 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
18e70 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
18e80 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
18e90 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
18ea0 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
18eb0 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
18ec0 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
18ed0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
18ee0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
18ef0 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
18f00 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
18f10 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
18f20 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
18f30 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
18f40 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
18f50 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
18f60 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
18f70 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18f80 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
18f90 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
18fa0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
18fb0 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
18fc0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
18fd0 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
18fe0 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
18ff0 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
19000 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
19010 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
19020 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
19030 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
19040 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
19050 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
19060 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
19070 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
19080 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
19090 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
190a0 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
190b0 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
190c0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
190d0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
190e0 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
190f0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
19100 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
19110 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
19120 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
19130 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
19140 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
19150 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
19160 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
19170 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
19180 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19190 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
191a0 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
191b0 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
191c0 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
191d0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
191e0 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
191f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
19200 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
19210 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
19220 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
19230 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
19240 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
19250 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19270 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
19280 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
19290 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
192a0 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
192b0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
192c0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
192d0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
192e0 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
192f0 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
19300 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
19310 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
19320 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
19330 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
19340 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
19350 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
19360 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
19370 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19380 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19390 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
193a0 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
193b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
193c0 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69  o one journal wi
193d0 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a  thin MJ file */.
193e0 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
193f0 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  tr;         /* S
19400 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20  pace to hold MJ 
19410 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20  filename from a 
19420 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
19430 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
19440 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
19450 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61  mount of space a
19460 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73  llocated to zMas
19470 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f  terPtr[] */..  /
19480 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
19490 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
194a0 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
194b0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
194c0 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
194d0 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
194e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
194f0 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
19500 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
19510 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
19520 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
19530 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
19540 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
19550 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
19560 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
19570 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
19580 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
19590 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
195a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
195b0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  MEM_BKPT;.  }els
195c0 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
195d0 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
195e0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
195f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
19600 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
19610 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
19620 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
19630 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
19640 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
19650 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19660 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19670 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  ut;..  /* Load t
19680 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
19690 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
196a0 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
196b0 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69  d from.  ** sqli
196c0 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
196d0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
196e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20  MasterJournal.  
196f0 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a   Also obtain.  *
19700 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  * sufficient spa
19710 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74  ce (in zMasterPt
19720 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  r) to hold the n
19730 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20  ames of master. 
19740 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
19750 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
19760 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63   regular rollbac
19770 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  k-journals..  */
19780 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
19790 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
197a0 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
197b0 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
197c0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
197d0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
197e0 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56   nMasterPtr = pV
197f0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
19800 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
19810 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  al = sqlite3Mall
19820 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  oc(nMasterJourna
19830 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b  l + nMasterPtr +
19840 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73   1);.  if( !zMas
19850 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
19860 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
19870 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  MEM_BKPT;.    go
19880 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19890 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50  ;.  }.  zMasterP
198a0 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75  tr = &zMasterJou
198b0 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
198c0 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73  nal+1];.  rc = s
198d0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61  qlite3OsRead(pMa
198e0 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
198f0 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74  rnal, (int)nMast
19900 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  erJournal, 0);. 
19910 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19920 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
19930 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74  ter_out;.  zMast
19940 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
19950 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a  rJournal] = 0;..
19960 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
19970 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77  sterJournal;.  w
19980 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
19990 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
199a0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
199b0 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73  {.    int exists
199c0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
199d0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
199e0 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
199f0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
19a00 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69   &exists);.    i
19a10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19a20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64   ){.      goto d
19a30 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19a40 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73    }.    if( exis
19a50 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ts ){.      /* O
19a60 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
19a70 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
19a80 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19a90 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
19aa0 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
19ab0 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
19ac0 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
19ad0 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
19ae0 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
19af0 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
19b00 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
19b10 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
19b20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63    */.      int c
19b30 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
19b40 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
19b50 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
19b60 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
19b70 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  AL);.      rc = 
19b80 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
19b90 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a  fs, zJournal, pJ
19ba0 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30  ournal, flags, 0
19bb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19bc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19bd0 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
19be0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
19bf0 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  }..      rc = re
19c00 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
19c10 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65  pJournal, zMaste
19c20 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72  rPtr, nMasterPtr
19c30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19c40 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
19c50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19c70 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
19c80 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
19c90 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  }..      c = zMa
19ca0 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26  sterPtr[0]!=0 &&
19cb0 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
19cc0 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
19cd0 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a  .      if( c ){.
19ce0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
19cf0 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
19d00 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
19d10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19d20 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f  e. */.        go
19d30 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19d40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19d50 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
19d60 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  (sqlite3Strlen30
19d70 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
19d80 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73   }. .  sqlite3Os
19d90 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
19da0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19db0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
19dc0 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
19dd0 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  ster_out:.  sqli
19de0 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
19df0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
19e00 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73  pMaster ){.    s
19e10 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
19e20 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
19e30 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75  rt( !isOpen(pJou
19e40 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c  rnal) );.    sql
19e50 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65  ite3_free(pMaste
19e60 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
19e70 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
19e80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19e90 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  used to change t
19ea0 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
19eb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
19ec0 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  ** file in the f
19ed0 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73  ile-system. This
19ee0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
19ef0 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
19f00 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
19f10 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
19f20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  a transaction (i
19f30 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67  ncluding rolling
19f40 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
19f50 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nal)..**.** If t
19f60 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
19f70 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65   file is not ope
19f80 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20  n, or the pager 
19f90 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72  is not in either
19fa0 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45  .** DBMOD or OPE
19fb0 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  N state, this fu
19fc0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
19fd0 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
19fe0 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68  e size .** of th
19ff0 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65  e file is change
1a000 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  d to nPage pages
1a010 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e   (nPage*pPager->
1a020 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e  pageSize bytes).
1a030 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65   .** If the file
1a040 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72   on disk is curr
1a050 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ently larger tha
1a060 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74  n nPage pages, t
1a070 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a  hen use the VFS.
1a080 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d  ** xTruncate() m
1a090 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74  ethod to truncat
1a0a0 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  e it..**.** Or, 
1a0b0 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  it might be the 
1a0c0 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69  case that the fi
1a0d0 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d  le on disk is sm
1a0e0 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e  aller than .** n
1a0f0 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65  Page pages. Some
1a100 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
1a110 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  m implementation
1a120 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73  s can get confus
1a130 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72  ed if .** you tr
1a140 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20  y to truncate a 
1a150 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a  file to some siz
1a160 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  e that is larger
1a170 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72   than it .** cur
1a180 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65  rently is, so de
1a190 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
1a1a0 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  nd write a singl
1a1b0 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a  e zero byte to .
1a1c0 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
1a1d0 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65  e new file inste
1a1e0 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ad..**.** If suc
1a1f0 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
1a200 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
1a210 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1a220 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67   while modifying
1a230 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1a240 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68   file, return th
1a250 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
1a260 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
1a270 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1a280 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
1a290 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
1a2a0 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
1a2b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
1a2c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1a2d0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
1a2e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1a2f0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
1a300 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
1a310 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
1a320 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26  ager->fd) .   &&
1a330 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
1a340 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
1a350 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
1a360 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1a370 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36  EN) .  ){.    i6
1a380 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
1a390 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20  ewSize;.    int 
1a3a0 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
1a3b0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61  >pageSize;.    a
1a3c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1a3d0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
1a3e0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54  LOCK );.    /* T
1a3f0 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20  ODO: Is it safe 
1a400 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46  to use Pager.dbF
1a410 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f  ileSize here? */
1a420 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a430 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1a440 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
1a450 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
1a460 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34  ze = szPage*(i64
1a470 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
1a480 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a490 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
1a4a0 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
1a4b0 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
1a4c0 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
1a4d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a4e0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
1a4f0 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
1a500 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
1a510 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61  currentSize+szPa
1a520 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ge)<=newSize ){.
1a530 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 54          char *pT
1a540 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  mp = pPager->pTm
1a550 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20  pSpace;.        
1a560 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20  memset(pTmp, 0, 
1a570 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  szPage);.       
1a580 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
1a590 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63  ize-szPage) == c
1a5a0 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
1a5b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a5c0 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
1a5d0 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20   >  currentSize 
1a5e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1a5f0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1a600 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c  Pager->fd, pTmp,
1a610 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65   szPage, newSize
1a620 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20  -szPage);.      
1a630 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1a640 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a650 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
1a660 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
1a670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a680 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a690 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a6a0 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73  a sanitized vers
1a6b0 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f  ion of the secto
1a6c0 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c  r-size of OS fil
1a6d0 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20  e pFile. The.** 
1a6e0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1a6f0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69  guaranteed to li
1a700 65 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64  e between 32 and
1a710 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a720 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a730 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
1a740 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
1a750 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71  .  int iRet = sq
1a760 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
1a770 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  e(pFile);.  if( 
1a780 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69  iRet<32 ){.    i
1a790 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c  Ret = 512;.  }el
1a7a0 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f  se if( iRet>MAX_
1a7b0 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20  SECTOR_SIZE ){. 
1a7c0 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53     assert( MAX_S
1a7d0 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20  ECTOR_SIZE>=512 
1a7e0 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41  );.    iRet = MA
1a7f0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  X_SECTOR_SIZE;. 
1a800 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74   }.  return iRet
1a810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1a820 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1a830 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1a840 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68   variable for th
1a850 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72  e given.** pager
1a860 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61   based on the va
1a870 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1a880 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20  the xSectorSize 
1a890 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65  method.** of the
1a8a0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
1a8b0 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20  ile. The sector 
1a8c0 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65  size will be use
1a8d0 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  d .** to determi
1a8e0 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20  ne the size and 
1a8f0 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75  alignment of jou
1a900 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20  rnal header and 
1a910 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
1a920 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68  al pointers with
1a930 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e  in created journ
1a940 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
1a950 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
1a960 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76  les the effectiv
1a970 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1a980 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
1a990 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
1a9a0 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70  se, for non-temp
1a9b0 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
1a9c0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1a9d0 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65  r size is.** the
1a9e0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1a9f0 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
1aa00 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e  ze() method roun
1aa10 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a  ded up to 32 if.
1aa20 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  ** it is less th
1aa30 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65  an 32, or rounde
1aa40 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45  d down to MAX_SE
1aa50 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a  CTOR_SIZE if it.
1aa60 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
1aa70 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  an MAX_SECTOR_SI
1aa80 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ZE..**.** If the
1aa90 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 53 51   file has the SQ
1aaa0 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1aab0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70  SAFE_OVERWRITE p
1aac0 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65  roperty, then se
1aad0 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69  t.** the effecti
1aae0 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74  ve sector size t
1aaf0 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61  o its minimum va
1ab00 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68 65 20  lue (512).  The 
1ab10 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50  purpose of.** pP
1ab20 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1ab30 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68   is to define th
1ab40 65 20 22 62 6c 61 73 74 20 72 61 64 69 75 73 22  e "blast radius"
1ab50 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a   of bytes that.*
1ab60 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69  * might change i
1ab70 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
1ab80 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
1ab90 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  o a single byte 
1aba0 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65  in.** that range
1abb0 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f 57 45  .  But with POWE
1abc0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c  RSAFE_OVERWRITE,
1abd0 20 74 68 65 20 62 6c 61 73 74 20 72 61 64 69 75   the blast radiu
1abe0 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68  s is zero.** (th
1abf0 61 74 20 69 73 20 77 68 61 74 20 50 4f 57 45 52  at is what POWER
1ac00 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d  SAFE_OVERWRITE m
1ac10 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e  eans), so we min
1ac20 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72  imize the sector
1ac30 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62  .** size.  For b
1ac40 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
1ac50 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f  bility of the ro
1ac60 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
1ac70 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77  ile format,.** w
1ac80 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20  e cannot reduce 
1ac90 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1aca0 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20  ctor size below 
1acb0 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  512..*/.static v
1acc0 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
1acd0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1ace0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  {.  assert( isOp
1acf0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
1ad00 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
1ad10 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  le );..  if( pPa
1ad20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20  ger->tempFile.  
1ad30 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
1ad40 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1ad50 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20  ics(pPager->fd) 
1ad60 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  & .             
1ad70 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1ad80 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1ad90 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  E)!=0.  ){.    /
1ada0 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
1adb0 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
1adc0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1add0 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
1ade0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
1adf0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
1ae00 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
1ae10 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
1ae20 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
1ae30 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
1ae40 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
1ae50 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31  >sectorSize = 51
1ae60 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
1ae70 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1ae80 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74  ze = sqlite3Sect
1ae90 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
1aea0 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  d);.  }.}../*.**
1aeb0 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
1aec0 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
1aed0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
1aee0 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
1aef0 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
1af00 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
1af10 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
1af20 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
1af30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1af40 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
1af50 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
1af60 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
1af70 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
1af80 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
1af90 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
1afa0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1afb0 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
1afc0 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
1afd0 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
1afe0 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
1aff0 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
1b000 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
1b010 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
1b020 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
1b030 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
1b040 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1b050 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
1b060 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1b070 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1b080 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
1b090 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
1b0a0 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
1b0b0 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
1b0c0 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
1b0d0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
1b0e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
1b0f0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
1b100 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
1b110 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
1b120 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
1b130 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1b140 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1b150 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
1b160 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
1b170 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
1b180 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
1b190 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
1b1a0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1b1b0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1b1c0 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
1b1d0 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64  *  (7)  zero pad
1b1e0 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20  ding out to the 
1b1f0 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65  next sector size
1b200 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20  ..**  (8)  Zero 
1b210 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
1b220 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
1b230 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
1b240 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
1b250 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
1b260 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
1b270 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
1b280 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
1b290 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
1b2a0 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
1b2b0 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
1b2c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
1b2d0 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
1b2e0 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 7 items above.
1b2f0 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
1b300 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1b310 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1b320 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 8th item..**
1b330 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
1b340 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
1b350 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
1b360 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
1b370 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
1b380 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
1b390 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1b3a0 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
1b3b0 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
1b3c0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
1b3d0 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
1b3e0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1b3f0 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
1b400 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
1b410 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
1b420 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1b430 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1b440 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
1b450 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
1b460 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1b470 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
1b480 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1b490 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
1b4a0 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
1b4b0 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
1b4c0 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
1b4d0 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
1b4e0 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
1b4f0 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
1b500 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
1b510 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
1b520 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
1b530 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
1b540 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
1b550 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
1b560 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
1b570 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
1b580 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
1b590 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
1b5a0 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
1b5b0 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
1b5c0 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
1b5d0 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
1b5e0 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
1b5f0 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
1b600 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
1b610 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
1b620 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
1b630 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
1b640 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
1b650 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
1b660 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
1b670 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
1b680 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
1b690 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
1b6a0 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
1b6b0 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
1b6c0 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
1b6d0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
1b6e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b6f0 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
1b700 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
1b710 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
1b720 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
1b730 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
1b740 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
1b750 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
1b760 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
1b770 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
1b780 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
1b790 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
1b7a0 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
1b7b0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1b7c0 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
1b7d0 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
1b7e0 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
1b7f0 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
1b800 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
1b810 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
1b820 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
1b830 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
1b840 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
1b850 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1b860 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48  d..**.** The isH
1b870 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  ot parameter ind
1b880 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61  icates that we a
1b890 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c  re trying to rol
1b8a0 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a  lback a journal.
1b8b0 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ** that might be
1b8c0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20   a hot journal. 
1b8d0 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65   Or, it could be
1b8e0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1b8f0 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76  l is .** preserv
1b900 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f  ed because of JO
1b910 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
1b920 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  T or JOURNALMODE
1b930 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66  _TRUNCATE..** If
1b940 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61   the journal rea
1b950 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65  lly is hot, rese
1b960 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  t the pager cach
1b970 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a  e prior rolling.
1b980 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74  ** back any cont
1b990 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75  ent.  If the jou
1b9a0 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70  rnal is merely p
1b9b0 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65  ersistent, no re
1b9c0 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64  set is.** needed
1b9d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b9e0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
1b9f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1ba00 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
1ba10 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
1ba20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
1ba30 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
1ba40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1ba50 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1ba60 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
1ba70 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ba90 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
1baa0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1bab0 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bad0 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
1bae0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
1baf0 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
1bb00 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1bb10 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
1bb20 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
1bb30 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1bb40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1bb50 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
1bb60 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1bb70 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
1bb80 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
1bb90 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
1bba0 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a  e3OsAccess() */.
1bbb0 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
1bbc0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
1bbd0 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
1bbe0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
1bbf0 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61   */.  int needPa
1bc00 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  gerReset;      /
1bc10 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
1bc20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69  page prior to fi
1bc30 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63  rst page rollbac
1bc40 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79  k */.  int nPlay
1bc50 62 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  back = 0;       
1bc60 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
1bc70 6f 66 20 70 61 67 65 73 20 72 65 73 74 6f 72 65  of pages restore
1bc80 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
1bc90 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
1bca0 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
1bcb0 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a  rds are in the j
1bcc0 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65  ournal.  Abort e
1bcd0 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65  arly if.  ** the
1bce0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74   journal is empt
1bcf0 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
1bd00 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1bd10 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20  >jfd) );.  rc = 
1bd20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1bd30 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
1bd40 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
1bd50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bd60 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1bd70 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
1bd80 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
1bd90 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
1bda0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
1bdb0 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
1bdc0 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
1bdd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
1bde0 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
1bdf0 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
1be00 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
1be10 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
1be20 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
1be30 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
1be40 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
1be50 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
1be60 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
1be70 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20  Technically the 
1be80 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20  following is an 
1be90 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74  error because it
1bea0 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20   assumes that.  
1beb0 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e  ** buffer Pager.
1bec0 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78  pTmpSpace is (mx
1bed0 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65  Pathname+1) byte
1bee0 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65  s or larger. i.e
1bef0 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61  . that.  ** (pPa
1bf00 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d  ger->pageSize >=
1bf10 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1bf20 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73  xPathname+1). Us
1bf30 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20  ing os_unix.c,. 
1bf40 20 2a 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 69   ** mxPathname i
1bf50 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
1bf60 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1bf70 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
1bf80 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
1bf90 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
1bfa0 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1bfb0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1bfc0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1bfd0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1bfe0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1bff0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1c000 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
1c010 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c020 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
1c030 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c040 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1c050 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
1c060 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
1c070 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
1c080 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
1c090 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
1c0a0 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
1c0b0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c0c0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
1c0d0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
1c0e0 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
1c0f0 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
1c100 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
1c110 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
1c120 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
1c130 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
1c140 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1c150 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
1c160 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
1c170 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
1c180 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
1c190 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1c1a0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
1c1b0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
1c1c0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1c1d0 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
1c1e0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
1c1f0 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
1c200 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
1c210 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
1c220 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
1c230 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
1c240 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
1c250 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76  process must hav
1c260 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  e failed while w
1c270 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
1c280 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
1c290 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
1c2a0 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
1c2b0 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
1c2c0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
1c2d0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
1c2e0 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
1c2f0 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
1c300 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c310 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
1c320 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1c330 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1c340 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1c350 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1c360 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
1c370 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
1c380 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1c390 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
1c3a0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1c3b0 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
1c3c0 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
1c3d0 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
1c3e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
1c3f0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1c400 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
1c410 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
1c420 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
1c430 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1c440 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
1c450 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1c460 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
1c470 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
1c480 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1c490 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
1c4a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c4b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1c4c0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1c4d0 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
1c4e0 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1c4f0 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
1c500 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
1c510 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1c520 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1c530 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1c540 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
1c550 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
1c560 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
1c570 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
1c580 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
1c590 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
1c5a0 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
1c5b0 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
1c5c0 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
1c5d0 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
1c5e0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1c5f0 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
1c600 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
1c610 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
1c620 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
1c630 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c640 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
1c650 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
1c660 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
1c670 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1c680 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
1c690 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
1c6a0 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
1c6b0 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
1c6c0 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
1c6d0 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
1c6e0 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
1c6f0 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
1c700 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
1c710 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
1c720 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
1c730 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
1c740 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
1c750 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
1c760 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
1c770 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
1c780 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
1c790 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
1c7a0 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
1c7b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
1c7c0 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
1c7d0 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
1c7e0 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
1c7f0 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
1c800 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
1c810 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c820 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
1c830 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
1c840 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
1c850 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
1c860 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1c870 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
1c880 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1c890 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1c8a0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1c8b0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1c8c0 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
1c8d0 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1c8e0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
1c8f0 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
1c900 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1c910 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1c920 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1c930 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
1c940 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
1c950 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
1c960 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1c970 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
1c980 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
1c990 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c9a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c9b0 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
1c9c0 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
1c9d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1c9e0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1c9f0 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
1ca00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ca10 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1ca20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1ca30 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1ca40 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
1ca50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
1ca60 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
1ca70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
1ca80 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
1ca90 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
1caa0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1cab0 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
1cac0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
1cad0 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
1cae0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
1caf0 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
1cb00 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1cb10 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1cb20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
1cb30 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
1cb40 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
1cb50 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1cb60 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
1cb70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1cb80 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
1cb90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cba0 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79  ){.        nPlay
1cbb0 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  back++;.      }e
1cbc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1cbd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1cbe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1cbf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1cc00 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
1cc10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1cc20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
1cc30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1cc40 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1cc50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
1cc60 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74  urnal has been t
1cc70 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79  runcated, simply
1cc80 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e   stop reading an
1cc90 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  d.          ** p
1cca0 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f  rocessing the jo
1ccb0 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68  urnal. This migh
1ccc0 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  t happen if the 
1ccd0 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
1cce0 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d        ** not com
1ccf0 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20  pletely written 
1cd00 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72  and synced prior
1cd10 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e   to a crash.  In
1cd20 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1cd30 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74  ** case, the dat
1cd40 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76  abase should hav
1cd50 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  e never been wri
1cd60 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  tten in the.    
1cd70 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70        ** first p
1cd80 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b  lace so it is OK
1cd90 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64   to simply aband
1cda0 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  on the rollback.
1cdb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1cdc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cdd0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1cde0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1cdf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ce00 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1ce10 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62   unable to rollb
1ce20 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65  ack, quit and re
1ce30 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20  turn the error. 
1ce40 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
1ce50 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
1ce60 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  se the pager to 
1ce70 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
1ce80 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20  state.          
1ce90 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75  ** so that no fu
1cea0 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20  rther harm will 
1ceb0 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70  be done.  Perhap
1cec0 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20  s the next.     
1ced0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
1cee0 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69  to come along wi
1cef0 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f  ll be able to ro
1cf00 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62  llback the datab
1cf10 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
1cf20 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
1cf30 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1cf40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cf50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
1cf60 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
1cf70 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
1cf80 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46  playback:.  /* F
1cf90 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62  ollowing a rollb
1cfa0 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
1cfb0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1cfc0 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69   back in its ori
1cfd0 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65  ginal.  ** state
1cfe0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
1cff0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1d000 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b  action, so invok
1d010 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  e the.  ** SQLIT
1d020 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1d030 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  NGED file-contro
1d040 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61  l method to disa
1d050 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73  ble the.  ** ass
1d060 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  ertion that the 
1d070 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1d080 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64  ter was modified
1d090 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1d0a0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1d0b0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
1d0c0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c  thods ){.    sql
1d0d0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1d0e0 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
1d0f0 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
1d100 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20  _UNCHANGED,0);. 
1d110 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1d120 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
1d130 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
1d140 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
1d150 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
1d160 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
1d170 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
1d180 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
1d190 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
1d1a0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
1d1b0 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
1d1c0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
1d1d0 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
1d1e0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1d1f0 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
1d200 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
1d210 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
1d220 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
1d230 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
1d240 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1d250 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
1d260 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
1d270 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
1d280 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
1d290 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
1d2a0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
1d2b0 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
1d2c0 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
1d2d0 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
1d2e0 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
1d2f0 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
1d300 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1d310 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
1d320 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
1d330 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
1d340 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
1d350 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
1d360 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
1d370 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1d380 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1d390 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
1d3a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d3b0 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
1d3c0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1d3d0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
1d3e0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1d3f0 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1d400 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1d410 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1d420 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1d430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1d440 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1d450 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61  TE_OK.   && (pPa
1d460 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1d470 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1d480 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1d490 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1d4a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1d4b0 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1d4c0 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
1d4d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d4e0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
1d4f0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1d500 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ion(pPager, zMas
1d510 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29  ter[0]!='\0', 0)
1d520 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d530 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1d540 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1d550 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
1d560 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
1d570 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1d580 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
1d590 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
1d5a0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1d5b0 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
1d5c0 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
1d5d0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
1d5e0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
1d5f0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
1d600 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
1d610 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
1d620 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
1d630 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1d640 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1d650 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79  ( isHot && nPlay
1d660 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  back ){.    sqli
1d670 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
1d680 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
1d690 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72  LLBACK, "recover
1d6a0 65 64 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d  ed %d pages from
1d6b0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
1d6c0 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c        nPlayback,
1d6d0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1d6e0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  l);.  }..  /* Th
1d6f0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1d700 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
1d710 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
1d720 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
1d730 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
1d740 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
1d750 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
1d760 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
1d770 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
1d780 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
1d790 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
1d7a0 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
1d7b0 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
1d7c0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
1d7d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d7e0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
1d7f0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65  content for page
1d800 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
1d810 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1d820 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  d into .** pPg->
1d830 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
1d840 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
1d850 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
1d860 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1d870 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
1d880 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1d890 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
1d8a0 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
1d8b0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
1d8c0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1d8d0 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
1d8e0 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
1d8f0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1d900 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1d910 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1d920 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
1d930 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1d940 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1d950 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
1d960 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1d970 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1d980 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1d990 67 48 64 72 20 2a 70 50 67 2c 20 75 33 32 20 69  gHdr *pPg, u32 i
1d9a0 46 72 61 6d 65 29 7b 0a 20 20 50 61 67 65 72 20  Frame){.  Pager 
1d9b0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1d9c0 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
1d9d0 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1d9e0 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
1d9f0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  */.  Pgno pgno =
1da00 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20   pPg->pgno;     
1da10 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
1da20 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
1da30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1da40 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1da50 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1da60 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72  nt pgsz = pPager
1da70 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e  ->pageSize; /* N
1da80 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1da90 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  o read */..  ass
1daa0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1dab0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
1dac0 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  R && !MEMDB );. 
1dad0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1dae0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
1daf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1db00 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28 20 69 46  MIT_WAL.  if( iF
1db10 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  rame ){.    /* T
1db20 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
1db30 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
1db40 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
1db50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1db60 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50  3WalReadFrame(pP
1db70 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61  ager->pWal, iFra
1db80 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70  me, pgsz, pPg->p
1db90 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Data);.  }else.#
1dba0 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36  endif.  {.    i6
1dbb0 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
1dbc0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1dbd0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1dbe0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1dbf0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1dc00 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
1dc10 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1dc20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1dc30 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1dc40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1dc50 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1dc60 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
1dc70 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
1dc80 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1dc90 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
1dca0 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1dcb0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
1dcc0 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
1dcd0 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
1dce0 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
1dcf0 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
1dd00 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
1dd10 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
1dd20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
1dd30 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
1dd40 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
1dd50 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
1dd60 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
1dd70 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1dd80 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
1dd90 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
1dda0 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
1ddb0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
1ddc0 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
1ddd0 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
1dde0 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
1ddf0 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
1de00 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
1de10 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
1de20 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
1de30 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1de40 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
1de50 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
1de60 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
1de70 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
1de80 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
1de90 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1dea0 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
1deb0 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
1dec0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
1ded0 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
1dee0 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  se equaling 16 b
1def0 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
1df00 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1df10 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
1df20 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1df30 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
1df40 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1df50 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
1df60 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
1df70 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1df80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1df90 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
1dfa0 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
1dfb0 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
1dfc0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1dfd0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1dfe0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1dff0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1e000 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
1e010 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1e020 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1e030 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1e040 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
1e050 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
1e060 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
1e070 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
1e080 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1e090 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
1e0a0 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
1e0b0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1e0c0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
1e0d0 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
1e0e0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1e0f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e100 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1e110 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
1e120 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
1e130 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e140 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1e150 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1e160 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1e170 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39  offsets 24 and 9
1e180 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64  2 in.** the head
1e190 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  er and the sqlit
1e1a0 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1e1b0 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a   at offset 96..*
1e1c0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
1e1d0 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
1e1e0 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  date.  See also 
1e1f0 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  the pager_incr_c
1e200 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a  hangecounter().*
1e210 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  * routine which 
1e220 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  only updates the
1e230 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1e240 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73  if the update is
1e250 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65   actually.** nee
1e260 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e  ded, as determin
1e270 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72  ed by the pPager
1e280 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1e290 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  e state variable
1e2a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e2b0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1e2c0 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72  ngecounter(PgHdr
1e2d0 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68   *pPg){.  u32 ch
1e2e0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20  ange_counter;.. 
1e2f0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1e300 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1e310 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1e320 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1e330 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1e340 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1e350 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e  4byte((u8*)pPg->
1e360 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e370 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69  rs)+1;.  put32bi
1e380 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1e390 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1e3a0 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1e3b0 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
1e3c0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
1e3d0 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
1e3e0 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
1e3f0 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
1e400 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
1e410 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
1e420 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
1e430 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61  umber.  ** is va
1e440 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  lid. */.  put32b
1e450 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1e460 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
1e470 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1e480 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1e490 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c  )pPg->pData)+96,
1e4a0 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1e4b0 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e  NUMBER);.}..#ifn
1e4c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e4d0 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
1e4e0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1e4f0 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1e500 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
1e510 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
1e520 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1e530 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
1e540 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1e550 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1e560 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
1e570 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
1e580 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
1e590 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
1e5a0 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
1e5b0 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
1e5c0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1e5d0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
1e5e0 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
1e5f0 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
1e600 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
1e610 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1e620 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
1e630 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
1e640 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
1e650 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
1e660 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
1e670 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
1e680 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
1e690 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
1e6a0 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
1e6b0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
1e6c0 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
1e6d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1e6e0 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
1e6f0 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
1e700 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1e710 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
1e720 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
1e730 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
1e740 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
1e750 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
1e760 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1e770 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1e780 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1e790 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
1e7a0 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
1e7b0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1e7c0 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20  Pager) );.  pPg 
1e7d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1e7e0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1e7f0 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1e800 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1e810 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1e820 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1e830 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1e840 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1e850 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
1e860 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  iFrame = 0;.    
1e870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1e880 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
1e890 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67  r->pWal, pPg->pg
1e8a0 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
1e8b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e8c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e8d0 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1e8e0 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20  (pPg, iFrame);. 
1e8f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e900 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e910 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1e920 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
1e930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e940 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1e950 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20  fNotNull(pPg);. 
1e960 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
1e970 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72  ormally, if a tr
1e980 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1e990 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61  led back, any ba
1e9a0 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61  ckup processes a
1e9b0 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  re.  ** updated 
1e9c0 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65  as data is copie
1e9d0 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c  d out of the rol
1e9e0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
1e9f0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  d into the.  ** 
1ea00 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
1ea10 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20  s not generally 
1ea20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20  possible with a 
1ea30 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73  WAL database, as
1ea40 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69  .  ** rollback i
1ea50 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74  nvolves simply t
1ea60 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f  runcating the lo
1ea70 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  g file. Therefor
1ea80 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f  e, if one.  ** o
1ea90 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61  r more frames ha
1eaa0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1eab0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
1eac0 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  og (and therefor
1ead0 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70  e .  ** also cop
1eae0 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63  ied into the bac
1eaf0 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61  kup databases) a
1eb00 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  s part of this t
1eb10 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a  ransaction,.  **
1eb20 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73   the backups mus
1eb30 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  t be restarted..
1eb40 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61    */.  sqlite3Ba
1eb50 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
1eb60 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20  er->pBackup);.. 
1eb70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1eb80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1eb90 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1eba0 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  rollback a trans
1ebb0 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20  action on a WAL 
1ebc0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1ebd0 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c  tic int pagerRol
1ebe0 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a  lbackWal(Pager *
1ebf0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1ec00 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1ec10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ec20 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
1ec30 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20  gHdr *pList;    
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ec50 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20  * List of dirty 
1ec60 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20  pages to revert 
1ec70 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c  */..  /* For all
1ec80 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
1ec90 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72  che that are cur
1eca0 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20  rently dirty or 
1ecb0 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
1ecc0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28  * been written (
1ecd0 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  but not committe
1ece0 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  d) to the log fi
1ecf0 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68  le, do one of th
1ed00 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  e .  ** followin
1ed10 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b  g:.  **.  **   +
1ed20 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63   Discard the cac
1ed30 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66  hed page (if ref
1ed40 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20  count==0), or.  
1ed50 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61  **   + Reload pa
1ed60 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ge content from 
1ed70 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66  the database (if
1ed80 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20   refcount>0)..  
1ed90 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
1eda0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1edb0 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d  OrigSize;.  rc =
1edc0 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28   sqlite3WalUndo(
1edd0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61  pPager->pWal, pa
1ede0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c  gerUndoCallback,
1edf0 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29   (void *)pPager)
1ee00 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  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 77 68 69 6c 65 28 20 70 4c  he);.  while( pL
1ee40 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ist && rc==SQLIT
1ee50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64  E_OK ){.    PgHd
1ee60 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
1ee70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63  ->pDirty;.    rc
1ee80 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c   = pagerUndoCall
1ee90 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61  back((void *)pPa
1eea0 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
1eeb0 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
1eec0 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Next;.  }..  ret
1eed0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1eee0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1eef0 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
1ef00 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61  nd sqlite3WalFra
1ef10 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61  mes(). As well a
1ef20 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65  s logging.** the
1ef30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1ef40 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68   list of pages h
1ef50 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28  eaded by pList (
1ef60 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
1ef70 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  rty),.** this fu
1ef80 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20  nction notifies 
1ef90 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75  any active backu
1efa0 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74  p processes that
1efb0 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a   the pages have.
1efc0 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a  ** changed. .**.
1efd0 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70  ** The list of p
1efe0 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f  ages passed into
1eff0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1f000 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62   always sorted b
1f010 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  y page number..*
1f020 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65  * Hence, if page
1f030 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68   1 appears anywh
1f040 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c  ere on the list,
1f050 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20   it will be the 
1f060 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a  first page..*/ .
1f070 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1f080 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67  WalFrames(.  Pag
1f090 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f0b0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1f0c0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20    PgHdr *pList, 
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0e0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61    /* List of fra
1f0f0 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20  mes to log */.  
1f100 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20  Pgno nTruncate, 
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f120 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1f130 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d   after this comm
1f140 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  it */.  int isCo
1f150 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1f160 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1f170 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  if this is a com
1f180 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  mit */.){.  int 
1f190 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f1b0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1f1c0 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20  int nList;      
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1f1f0 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20  es in pList */. 
1f200 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f220 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1f230 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20  over pages */.. 
1f240 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f250 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  >pWal );.  asser
1f260 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64  t( pList );.#ifd
1f270 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1f280 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1f290 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69   the page list i
1f2a0 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
1f2b0 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d  rder */.  for(p=
1f2c0 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70  pList; p && p->p
1f2d0 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72  Dirty; p=p->pDir
1f2e0 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ty){.    assert(
1f2f0 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44   p->pgno < p->pD
1f300 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  irty->pgno );.  
1f310 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1f320 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  rt( pList->pDirt
1f330 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74  y==0 || isCommit
1f340 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d   );.  if( isComm
1f350 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  it ){.    /* If 
1f360 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1f370 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69  n is being commi
1f380 74 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e  tted, there is n
1f390 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69  o point in writi
1f3a0 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61  ng.    ** any pa
1f3b0 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
1f3c0 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68  mbers greater th
1f3d0 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74  an nTruncate int
1f3e0 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a  o the WAL file..
1f3f0 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c      ** They will
1f400 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 62   never be read b
1f410 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f  y any client. So
1f420 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f   remove them fro
1f430 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20 20 20  m the pDirty.   
1f440 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a   ** list here. *
1f450 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70  /.    PgHdr **pp
1f460 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20  Next = &pList;. 
1f470 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20     nList = 0;.  
1f480 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28    for(p=pList; (
1f490 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b  *ppNext = p)!=0;
1f4a0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1f4b0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f       if( p->pgno
1f4c0 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  <=nTruncate ){. 
1f4d0 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20         ppNext = 
1f4e0 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  &p->pDirty;.    
1f4f0 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20      nList++;.   
1f500 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
1f510 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1f520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69    }else{.    nLi
1f530 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50  st = 1;.  }.  pP
1f540 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
1f550 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d  R_STAT_WRITE] +=
1f560 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70   nList;..  if( p
1f570 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
1f580 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
1f590 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
1f5a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1f5b0 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
1f5c0 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70  ->pWal, .      p
1f5d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1f5e0 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74   pList, nTruncat
1f5f0 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61  e, isCommit, pPa
1f600 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
1f610 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  s.  );.  if( rc=
1f620 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1f630 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b  ager->pBackup ){
1f640 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1f650 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1f660 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f670 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
1f680 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d  ger->pBackup, p-
1f690 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e  >pgno, (u8 *)p->
1f6a0 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
1f6b0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1f6c0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70  _CHECK_PAGES.  p
1f6d0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1f6e0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1f6f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1f700 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1f710 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1f720 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
1f730 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23  gehash(p);.  }.#
1f740 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
1f750 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
1f760 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  in a read transa
1f770 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c  ction on the WAL
1f780 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1f790 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20  tine used to be 
1f7a0 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65  called "pagerOpe
1f7b0 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63  nSnapshot()" bec
1f7c0 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61  ause it essentia
1f7d0 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73  lly.** makes a s
1f7e0 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64  napshot of the d
1f7f0 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63  atabase at the c
1f800 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20  urrent point in 
1f810 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76  time and preserv
1f820 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73  es.** that snaps
1f830 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74  hot for use by t
1f840 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69  he reader in spi
1f850 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74  te of concurrent
1f860 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a  ly changes by.**
1f870 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f   other writers o
1f880 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e  r checkpointers.
1f890 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f8a0 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
1f8b0 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
1f8c0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1f8d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1f8e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f8f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1f900 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20  nt changed = 0; 
1f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f920 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20  * True if cache 
1f930 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f  must be reset */
1f940 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
1f950 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1f960 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f970 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1f980 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
1f990 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1f9a0 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a  _READER );..  /*
1f9b0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1f9c0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  adTransaction() 
1f9d0 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66  was not called f
1f9e0 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  or the previous.
1f9f0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1fa00 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1fa10 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20  =EXCLUSIVE.  So 
1fa20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66  call it now.  If
1fa30 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20   we.  ** are in 
1fa40 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52  locking_mode=NOR
1fa50 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28  MAL and EndRead(
1fa60 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) was previously
1fa70 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68   called,.  ** th
1fa80 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c  e duplicate call
1fa90 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20   is harmless..  
1faa0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45  */.  sqlite3WalE
1fab0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1fac0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
1fad0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1fae0 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e  WalBeginReadTran
1faf0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1fb00 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b  pWal, &changed);
1fb10 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1fb20 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20  E_OK || changed 
1fb30 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
1fb40 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1fb50 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
1fb60 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
1fb70 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
1fb80 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
1fb90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1fba0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1fbb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1fbc0 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
1fbd0 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66  the transition f
1fbe0 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a  rom PAGER_OPEN.*
1fbf0 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  * to PAGER_READE
1fc00 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72  R state to deter
1fc10 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mine the size of
1fc20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fc30 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28  le.** in pages (
1fc40 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67  assuming the pag
1fc50 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79  e size currently
1fc60 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
1fc70 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a  .pageSize)..**.*
1fc80 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
1fc90 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
1fca0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1fcb0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1fcc0 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70  database.** in p
1fcd0 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69  ages is stored i
1fce0 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72  n *pnPage. Other
1fcf0 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63  wise, an error c
1fd00 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20  ode (perhaps.** 
1fd10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1fd20 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20  AT) is returned 
1fd30 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1fd40 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a  eft unmodified..
1fd50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1fd60 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
1fd70 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1fd80 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e   *pnPage){.  Pgn
1fd90 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fdb0 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
1fdc0 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
1fdd0 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57    /* Query the W
1fde0 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f  AL sub-system fo
1fdf0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  r the database s
1fe00 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69  ize. The WalDbsi
1fe10 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69  ze().  ** functi
1fe20 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  on returns zero 
1fe30 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f  if the WAL is no
1fe40 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67  t open (i.e. Pag
1fe50 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a  er.pWal==0), or.
1fe60 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61    ** if the data
1fe70 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
1fe80 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20   available. The 
1fe90 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1fea0 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61   not.  ** availa
1feb0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c  ble from the WAL
1fec0 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74   sub-system if t
1fed0 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65  he log file is e
1fee0 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e  mpty or.  ** con
1fef0 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63  tains no valid c
1ff00 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63  ommitted transac
1ff10 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  tions..  */.  as
1ff20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1ff30 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1ff40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1ff50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  ager->eLock>=SHA
1ff60 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
1ff70 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1ff80 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
1ff90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
1ffa0 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 6e  mpFile==0 );.  n
1ffb0 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61  Page = sqlite3Wa
1ffc0 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  lDbsize(pPager->
1ffd0 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  pWal);..  /* If 
1ffe0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1fff0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
20000 61 73 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ase is not avail
20010 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20  able from the.  
20020 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  ** WAL sub-syste
20030 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  m, determine the
20040 20 70 61 67 65 20 63 6f 75 6e 74 65 20 62 61 73   page counte bas
20050 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f  ed on the size o
20060 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
20070 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
20080 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
20090 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
200a0 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67  ot an.  ** integ
200b0 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
200c0 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f  he page-size, ro
200d0 75 6e 64 20 75 70 20 74 68 65 20 72 65 73 75 6c  und up the resul
200e0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  t..  */.  if( nP
200f0 61 67 65 3d 3d 30 20 26 26 20 41 4c 57 41 59 53  age==0 && ALWAYS
20100 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  (isOpen(pPager->
20110 66 64 29 29 20 29 7b 0a 20 20 20 20 69 36 34 20  fd)) ){.    i64 
20120 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
20130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20140 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20  e of db file in 
20150 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  bytes */.    int
20160 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
20170 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
20180 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 69 66 28  fd, &n);.    if(
20190 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
201a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
201b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  c;.    }.    nPa
201c0 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70  ge = (Pgno)((n+p
201d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
201e0 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67  1) / pPager->pag
201f0 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
20200 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
20210 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
20220 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
20230 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
20240 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
20250 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
20260 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
20270 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
20280 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
20290 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
202a0 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
202b0 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
202c0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
202d0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
202e0 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
202f0 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65   *pnPage = nPage
20300 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
20310 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
20320 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
20330 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
20340 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
20350 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
20360 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
20370 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72  opened by pPager
20380 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74 68  .** exists if th
20390 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
203a0 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66  t empy, or verif
203b0 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c  y that the *-wal
203c0 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
203d0 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c 65  t exist (by dele
203e0 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65 20  ting it) if the 
203f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
20400 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
20410 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20420 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74   not empty and t
20430 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  he *-wal file ex
20440 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  ists, open the p
20450 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d  ager.** in WAL m
20460 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 74  ode.  If the dat
20470 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f  abase is empty o
20480 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69  r if no *-wal fi
20490 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a  le exists and.**
204a0 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
204b0 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50  urs, make sure P
204c0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
204d0 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a   is not set to.*
204e0 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
204f0 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52  ODE_WAL..**.** R
20500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
20510 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
20520 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
20530 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
20540 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
20550 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20560 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
20570 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
20580 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
20590 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
205a0 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
205b0 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
205c0 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70  AL on a none-emp
205d0 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  ty database, thi
205e0 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20  s ensures there 
205f0 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69  is no race condi
20600 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e  tion .** between
20610 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62   the xAccess() b
20620 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c  elow and an xDel
20630 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63  ete() being exec
20640 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a  uted by some .**
20650 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
20660 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
20670 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
20680 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50  resent(Pager *pP
20690 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
206a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
206b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
206c0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
206d0 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
206e0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
206f0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
20700 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
20710 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
20720 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20   isWal;         
20730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20740 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65  ue if WAL file e
20750 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e  xists */.    Pgn
20760 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
20770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
20780 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
20790 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
207a0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
207b0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
207c0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
207d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
207e0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
207f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20800 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
20810 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
20820 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ->zWal, 0);.    
20830 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20840 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
20850 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ENT ) rc = SQLIT
20860 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57 61  E_OK;.      isWa
20870 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  l = 0;.    }else
20880 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20890 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
208a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
208b0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
208c0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
208d0 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c  S_EXISTS, &isWal
208e0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
208f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
20910 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20  f( isWal ){.    
20920 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71      testcase( sq
20930 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
20940 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
20950 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ache)==0 );.    
20960 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20970 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61  PagerOpenWal(pPa
20980 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ger, 0);.      }
20990 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
209a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
209b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
209c0 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  WAL ){.        p
209d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
209e0 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
209f0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20  ALMODE_DELETE;. 
20a00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20a10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20a20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c  #endif../*.** Pl
20a30 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74  ayback savepoint
20a40 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c   pSavepoint. Or,
20a50 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d   if pSavepoint==
20a60 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62  NULL, then playb
20a70 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  ack.** the entir
20a80 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
20a90 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20   file. The case 
20aa0 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
20ab0 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a   occurs when .**
20ac0 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63   a ROLLBACK TO c
20ad0 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65  ommand is invoke
20ae0 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54  d on a SAVEPOINT
20af0 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73   that is a trans
20b00 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70  action .** savep
20b10 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oint..**.** When
20b20 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e   pSavepoint is n
20b30 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67  ot NULL (meaning
20b40 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69   a non-transacti
20b50 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
20b60 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64  .** being rolled
20b70 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65   back), then the
20b80 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73   rollback consis
20b90 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65  ts of up to thre
20ba0 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72  e stages,.** per
20bb0 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72  formed in the or
20bc0 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a  der specified:.*
20bd0 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61  *.**   * Pages a
20be0 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  re played back f
20bf0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
20c00 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
20c10 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66   byte.**     off
20c20 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69  set PagerSavepoi
20c30 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
20c40 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a  ontinuing to .**
20c50 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
20c60 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20  int.iHdrOffset, 
20c70 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  or to the end of
20c80 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20c90 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66  l.**     file if
20ca0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
20cb0 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65  iHdrOffset is ze
20cc0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ro..**.**   * If
20cd0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
20ce0 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f  iHdrOffset is no
20cf0 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67  t zero, then pag
20d00 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a  es are played.**
20d10 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69       back starti
20d20 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ng from the jour
20d30 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64  nal header immed
20d40 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
20d50 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
20d60 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
20d70 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  et to the end of
20d80 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20d90 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  l file..**.**   
20da0 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e  * Pages are then
20db0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
20dc0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
20dd0 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67  l file, starting
20de0 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65  .**     with the
20df0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
20e00 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74  iSubRec and cont
20e10 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e  inuing to the en
20e20 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20  d of.**     the 
20e30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
20e40 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74  .** Throughout t
20e50 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63  he rollback proc
20e60 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61  ess, each time a
20e70 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20   page is rolled 
20e80 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72  back, the.** cor
20e90 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
20ea0 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65  s set in a bitve
20eb0 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72  c structure (var
20ec0 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74  iable pDone in t
20ed0 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  he.** implementa
20ee0 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69  tion below). Thi
20ef0 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73  s is used to ens
20f00 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20  ure that a page 
20f10 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65  is only.** rolle
20f20 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74  d back the first
20f30 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f   time it is enco
20f40 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65  untered in eithe
20f50 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  r journal..**.**
20f60 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69   If pSavepoint i
20f70 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67  s NULL, then pag
20f80 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79  es are only play
20f90 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
20fa0 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
20fb0 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20   file. There is 
20fc0 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69  no need for a bi
20fd0 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73  tvec in this cas
20fe0 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68  e..**.** In eith
20ff0 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20  er case, before 
21000 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63  playback commenc
21010 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53  es the Pager.dbS
21020 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ize variable.** 
21030 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20  is reset to the 
21040 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65  value that it he
21050 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ld at the start 
21060 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  of the savepoint
21070 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63   .** (or transac
21080 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77  tion). No page w
21090 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65  ith a page-numbe
210a0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
210b0 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  his value.** is 
210c0 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20  played back. If 
210d0 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  one is encounter
210e0 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20  ed it is simply 
210f0 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
21100 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79  ic int pagerPlay
21110 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61  backSavepoint(Pa
21120 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67  ger *pPager, Pag
21130 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61  erSavepoint *pSa
21140 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20  vepoint){.  i64 
21150 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
21160 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76       /* Effectiv
21170 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
21180 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
21190 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
211a0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
211b0 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74  of first segment
211c0 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c   of main-journal
211d0 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   records */.  in
211e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
211f0 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
21200 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65   code */.  Bitve
21210 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20  c *pDone = 0;   
21220 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f      /* Bitvec to
21230 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c   ensure pages pl
21240 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f  ayed back only o
21250 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  nce */..  assert
21260 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
21270 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
21280 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21290 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
212a0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
212b0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
212c0 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65   a bitvec to use
212d0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
212e0 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65  t of pages rolle
212f0 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  d back */.  if( 
21300 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
21310 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65    pDone = sqlite
21320 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53  3BitvecCreate(pS
21330 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29  avepoint->nOrig)
21340 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65  ;.    if( !pDone
21350 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
21360 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
21370 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
21380 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61   /* Set the data
21390 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74  base size back t
213a0 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77  o the value it w
213b0 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61  as before the sa
213c0 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65  vepoint .  ** be
213d0 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73  ing reverted was
213e0 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
213f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
21400 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53   pSavepoint ? pS
21410 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20  avepoint->nOrig 
21420 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  : pPager->dbOrig
21430 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
21440 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
21450 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
21460 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76  le;..  if( !pSav
21470 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55  epoint && pagerU
21480 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
21490 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
214a0 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61  rRollbackWal(pPa
214b0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
214c0 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  Use pPager->jour
214d0 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66  nalOff as the ef
214e0 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
214f0 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
21500 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
21510 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   The actual file
21520 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
21530 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20   than this in.  
21540 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
21550 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72  MODE_TRUNCATE or
21560 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
21570 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74  DE_PERSIST.  But
21580 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70   anything.  ** p
21590 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ast pPager->jour
215a0 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69  nalOff is off-li
215b0 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f  mits to us..  */
215c0 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
215d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61  >journalOff;.  a
215e0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
215f0 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c  al(pPager)==0 ||
21600 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a   szJ==0 );..  /*
21610 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e   Begin by rollin
21620 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66  g back records f
21630 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
21640 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
21650 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70  .  ** PagerSavep
21660 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
21670 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74   continuing to t
21680 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
21690 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65  header..  ** The
216a0 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f  re might be reco
216b0 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rds in the main 
216c0 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76  journal that hav
216d0 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  e a page number.
216e0 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61    ** greater tha
216f0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  n the current da
21700 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61  tabase size (pPa
21710 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74  ger->dbSize) but
21720 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c   those.  ** will
21730 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f   be skipped auto
21740 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65  matically.  Page
21750 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70  s are added to p
21760 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a  Done as they.  *
21770 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  * are played bac
21780 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  k..  */.  if( pS
21790 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67  avepoint && !pag
217a0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
217b0 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20   ){.    iHdrOff 
217c0 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  = pSavepoint->iH
217d0 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65  drOffset ? pSave
217e0 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
217f0 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61  t : szJ;.    pPa
21800 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21810 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f  = pSavepoint->iO
21820 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65  ffset;.    while
21830 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21840 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
21850 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b  alOff<iHdrOff ){
21860 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
21870 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
21880 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
21890 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
218a0 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20   pDone, 1, 1);. 
218b0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
218c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
218d0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
218e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
218f0 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Off = 0;.  }..  
21900 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c  /* Continue roll
21910 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
21920 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
21930 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
21940 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69  g at.  ** the fi
21950 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
21960 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74  er seen and cont
21970 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65  inuing until the
21980 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20   effective end. 
21990 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20   ** of the main 
219a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43  journal file.  C
219b0 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20  ontinue to skip 
219c0 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  out-of-range pag
219d0 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74  es and.  ** cont
219e0 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65  inue adding page
219f0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  s rolled back to
21a00 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77   pDone..  */.  w
21a10 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
21a20 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
21a30 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b  ournalOff<szJ ){
21a40 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
21a50 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
21a60 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75  counter */.    u
21a70 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20  32 nJRec = 0;   
21a80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a    /* Number of J
21a90 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a  ournal Records *
21aa0 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  /.    u32 dummy;
21ab0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
21ac0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
21ad0 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c   0, szJ, &nJRec,
21ae0 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73   &dummy);.    as
21af0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21b00 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a  _DONE );..    /*
21b10 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61  .    ** The "pPa
21b20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
21b30 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
21b40 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
21b50 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20  journalOff".    
21b60 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74  ** test is relat
21b70 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35  ed to ticket #25
21b80 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73  65.  See the dis
21b90 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20  cussion in the. 
21ba0 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79     ** pager_play
21bb0 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20  back() function 
21bc0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
21bd0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20  nformation..    
21be0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63  */.    if( nJRec
21bf0 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61  ==0 .     && pPa
21c00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
21c10 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
21c20 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
21c30 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29  journalOff.    )
21c40 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
21c50 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61  (u32)((szJ - pPa
21c60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
21c70 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
21c80 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20  Pager));.    }. 
21c90 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d     for(ii=0; rc=
21ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
21cb0 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72  <nJRec && pPager
21cc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
21cd0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  ; ii++){.      r
21ce0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
21cf0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
21d00 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  er, &pPager->jou
21d10 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20  rnalOff, pDone, 
21d20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
21d30 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
21d40 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
21d50 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21d60 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
21d70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73  r->journalOff>=s
21d80 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61  zJ );..  /* Fina
21d90 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70  lly,  rollback p
21da0 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75  ages from the su
21db0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65  b-journal.  Page
21dc0 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20   that were.  ** 
21dd0 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65  previously rolle
21de0 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68  d back out of th
21df0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28  e main journal (
21e00 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e  and are hence in
21e10 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c   pDone).  ** wil
21e20 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f  l be skipped.  O
21e30 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
21e40 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70  s are also skipp
21e50 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
21e60 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
21e70 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
21e80 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
21e90 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f  ter */.    i64 o
21ea0 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53 61  ffset = (i64)pSa
21eb0 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
21ec0 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
21ed0 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Size);..    if( 
21ee0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
21ef0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
21f00 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65  = sqlite3WalSave
21f10 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72  pointUndo(pPager
21f20 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69  ->pWal, pSavepoi
21f30 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20  nt->aWalData);. 
21f40 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
21f50 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
21f60 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Rec; rc==SQLITE_
21f70 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d  OK && ii<pPager-
21f80 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b  >nSubRec; ii++){
21f90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
21fa0 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28  ffset==(i64)ii*(
21fb0 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
21fc0 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ze) );.      rc 
21fd0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
21fe0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
21ff0 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65  , &offset, pDone
22000 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 1);.    }. 
22010 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
22020 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
22030 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  }..  sqlite3Bitv
22040 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29  ecDestroy(pDone)
22050 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22060 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
22070 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
22080 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65  = szJ;.  }..  re
22090 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
220a0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
220b0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
220c0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
220d0 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a  hat are allowed.
220e0 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ** before attemp
220f0 74 69 6e 67 20 74 6f 20 72 65 63 79 63 6c 65 20  ting to recycle 
22100 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75 73 65 64  clean and unused
22110 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20   pages..*/.void 
22120 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
22130 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
22140 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
22150 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  ge){.  sqlite3Pc
22160 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65  acheSetCachesize
22170 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
22180 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  , mxPage);.}../*
22190 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
221a0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
221b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
221c0 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
221d0 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65  d.** before atte
221e0 6d 70 74 69 6e 67 20 74 6f 20 73 70 69 6c 6c 20  mpting to spill 
221f0 70 61 67 65 73 20 74 6f 20 6a 6f 75 72 6e 61 6c  pages to journal
22200 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22210 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a  PagerSetSpillsiz
22220 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
22230 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
22240 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
22250 61 63 68 65 53 65 74 53 70 69 6c 6c 73 69 7a 65  acheSetSpillsize
22260 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
22270 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  , mxPage);.}../*
22280 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54  .** Invoke SQLIT
22290 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
222a0 45 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  E based on the c
222b0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
222c0 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69  szMmap..*/.stati
222d0 63 20 76 6f 69 64 20 70 61 67 65 72 46 69 78 4d  c void pagerFixM
222e0 61 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  aplimit(Pager *p
222f0 50 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c 49  Pager){.#if SQLI
22300 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
22310 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  >0.  sqlite3_fil
22320 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e  e *fd = pPager->
22330 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  fd;.  if( isOpen
22340 28 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65 74  (fd) && fd->pMet
22350 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d  hods->iVersion>=
22360 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  3 ){.    sqlite3
22370 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20 73  _int64 sz;.    s
22380 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d  z = pPager->szMm
22390 61 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ap;.    pPager->
223a0 62 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a 3e  bUseFetch = (sz>
223b0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  0);.    sqlite3O
223c0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
223d0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
223e0 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
223f0 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23  IZE, &sz);.  }.#
22400 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
22410 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
22420 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65  m size of any me
22430 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64  mory mapping mad
22440 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
22450 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
22460 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
22470 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  mapLimit(Pager *
22480 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f  pPager, sqlite3_
22490 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
224a0 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20   pPager->szMmap 
224b0 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65  = szMmap;.  page
224c0 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
224d0 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ger);.}../*.** F
224e0 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
224f0 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
22500 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  rom the pager..*
22510 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
22520 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20  gerShrink(Pager 
22530 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
22540 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28  te3PcacheShrink(
22550 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
22560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
22570 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68  t settings of th
22580 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65  e pager to those
22590 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
225a0 65 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65  e pgFlags parame
225b0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  ter..**.** The "
225c0 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67  level" in pgFlag
225d0 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52  s & PAGER_SYNCHR
225e0 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20  ONOUS_MASK sets 
225f0 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a  the robustness.*
22600 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
22610 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
22620 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72  to OS crashes or
22630 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
22640 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  by.** changing t
22650 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
22660 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
22670 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e  ng the journals.
22680 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 66 6f  .** There are fo
22690 75 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ur levels:.**.**
226a0 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
226b0 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
226c0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
226d0 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
226e0 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
226f0 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
22700 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
22710 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
22720 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
22730 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
22740 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
22750 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
22760 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22770 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
22780 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
22790 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
227a0 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
227b0 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
227c0 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
227d0 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
227e0 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
227f0 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
22800 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
22810 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
22820 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
22830 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
22840 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
22850 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
22860 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
22870 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
22880 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
22890 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
228a0 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
228b0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
228c0 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
228d0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
228e0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
228f0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
22900 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
22910 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
22920 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
22930 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
22940 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
22950 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
22960 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
22970 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
22990 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
229a0 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
229b0 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
229c0 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
229d0 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
229e0 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
229f0 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
22a00 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
22a10 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
22a20 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
22a30 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
22a40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22a50 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
22a60 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
22a70 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
22a80 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ollback..**.**  
22a90 20 20 45 58 54 52 41 20 20 20 20 20 54 68 69 73    EXTRA     This
22aa0 20 69 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65 78   is like FULL ex
22ab0 63 65 70 74 20 74 68 61 74 20 69 73 20 61 6c 73  cept that is als
22ac0 6f 20 73 79 6e 63 73 20 74 68 65 20 64 69 72 65  o syncs the dire
22ad0 63 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  ctory.**        
22ae0 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61        that conta
22af0 69 6e 73 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ins the rollback
22b00 20 6a 6f 75 72 6e 61 6c 20 61 66 74 65 72 20 74   journal after t
22b10 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20  he rollback.**  
22b20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
22b30 6e 61 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64 2e  nal is unlinked.
22b40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
22b50 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
22b60 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
22b70 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
22b80 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
22b90 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
22ba0 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
22bb0 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
22bc0 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
22bd0 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
22be0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
22bf0 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
22c00 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
22c10 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
22c20 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
22c30 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
22c40 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
22c50 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
22c60 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
22c70 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
22c80 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
22c90 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
22ca0 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
22cb0 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
22cc0 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
22cd0 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
22ce0 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
22cf0 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
22d00 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
22d10 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
22d20 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
22d30 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
22d40 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
22d50 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
22d60 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
22d70 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
22d80 20 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58 54   FULL.** and EXT
22d90 52 41 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 2e  RA for WAL mode.
22da0 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
22db0 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
22dc0 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
22dd0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
22de0 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
22df0 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
22e00 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
22e10 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
22e20 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
22e30 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
22e40 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
22e50 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
22e60 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
22e70 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
22e80 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
22e90 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
22ea0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22eb0 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
22ec0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
22ed0 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
22ee0 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
22ef0 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
22f00 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
22f10 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
22f20 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
22f30 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
22f40 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
22f50 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
22f60 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
22f70 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
22f80 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
22f90 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
22fa0 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
22fb0 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
22fc0 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
22fd0 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
22fe0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
22ff0 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
23000 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
23010 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  gs(.  Pager *pPa
23020 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
23030 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20  he pager to set 
23040 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72  safety level for
23050 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
23060 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56  gFlags      /* V
23070 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  arious flags */.
23080 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65  ){.  unsigned le
23090 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20  vel = pgFlags & 
230a0 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
230b0 53 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70 50  S_MASK;.  if( pP
230c0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
230d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
230e0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
230f0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
23100 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
23110 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20  extraSync = 0;. 
23120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
23130 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
23140 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel==PAGER_SYNCH
23150 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30 3b  RONOUS_OFF ?1:0;
23160 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
23170 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d 50  lSync = level>=P
23180 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
23190 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20 20  _FULL ?1:0;.    
231a0 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
231b0 63 20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52  c = level==PAGER
231c0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58 54  _SYNCHRONOUS_EXT
231d0 52 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 69  RA ?1:0;.  }.  i
231e0 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
231f0 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
23200 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  >syncFlags = 0;.
23210 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
23220 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  SyncFlags = 0;. 
23230 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61   }else if( pgFla
23240 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46  gs & PAGER_FULLF
23250 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67  SYNC ){.    pPag
23260 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
23270 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
23280 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
23290 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
232a0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
232b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
232c0 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54  ags & PAGER_CKPT
232d0 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20  _FULLFSYNC ){.  
232e0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
232f0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
23300 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
23310 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
23320 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
23330 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  C_FULL;.  }else{
23340 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
23350 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
23360 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
23370 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
23380 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
23390 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
233a0 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  .  pPager->walSy
233b0 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
233c0 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69  ->syncFlags;.  i
233d0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
233e0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
233f0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
23400 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e  |= WAL_SYNC_TRAN
23410 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20  SACTIONS;.  }.  
23420 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
23430 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29  GER_CACHESPILL )
23440 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  {.    pPager->do
23450 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
23460 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65  LLFLAG_OFF;.  }e
23470 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
23480 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
23490 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
234a0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
234b0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
234c0 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
234d0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
234e0 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
234f0 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
23500 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
23510 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
23520 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
23530 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
23540 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
23550 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
23560 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
23570 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
23580 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
23590 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
235a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
235b0 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
235c0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
235d0 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
235e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
235f0 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
23600 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
23610 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
23620 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
23630 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
23640 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
23650 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
23660 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
23670 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
23680 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
23690 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
236a0 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
236b0 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
236c0 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
236d0 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
236e0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
236f0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23700 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
23710 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
23720 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
23730 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
23740 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
23750 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
23760 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
23770 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
23780 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
23790 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
237a0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
237b0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
237c0 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
237d0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
237e0 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
237f0 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
23800 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
23810 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
23820 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
23830 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
23840 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
23850 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
23860 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
23870 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
23880 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
23890 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
238a0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
238b0 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
238c0 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
238d0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
238e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
238f0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
23900 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
23910 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
23920 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
23930 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
23940 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
23950 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
23960 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
23970 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
23980 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
23990 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
239a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
239b0 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
239c0 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
239d0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
239e0 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
239f0 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
23a00 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
23a10 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
23a20 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
23a30 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
23a40 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
23a50 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
23a60 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
23a70 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
23a80 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
23a90 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
23aa0 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
23ab0 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
23ac0 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
23ad0 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
23ae0 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
23af0 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
23b00 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
23b10 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
23b20 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
23b30 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
23b40 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
23b50 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
23b60 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
23b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b80 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
23b90 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
23ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23bd0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
23be0 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
23bf0 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
23c00 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
23c10 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
23c20 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
23c30 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
23c40 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
23c50 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
23c60 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
23c70 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
23c80 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
23c90 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
23ca0 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
23cb0 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
23cc0 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
23cd0 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
23ce0 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
23cf0 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
23d00 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
23d10 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
23d20 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
23d30 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
23d40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
23d50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
23d60 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
23d70 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
23d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
23d90 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
23da0 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
23db0 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
23dc0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
23dd0 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
23de0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
23df0 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
23e00 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
23e10 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
23e20 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
23e30 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70  andler */.){.  p
23e40 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
23e50 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
23e60 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
23e70 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
23e80 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
23e90 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
23ea0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
23eb0 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76    void **ap = (v
23ec0 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e  oid **)&pPager->
23ed0 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
23ee0 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28    assert( ((int(
23ef0 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30  *)(void *))(ap[0
23f00 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65  ]))==xBusyHandle
23f10 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
23f20 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e   ap[1]==pBusyHan
23f30 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73  dlerArg );.    s
23f40 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
23f50 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
23f60 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
23f70 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76  _BUSYHANDLER, (v
23f80 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d  oid *)ap);.  }.}
23f90 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
23fa0 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
23fb0 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
23fc0 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
23fd0 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
23fe0 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
23ff0 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
24000 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
24010 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
24020 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
24030 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
24040 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
24050 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
24060 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
24070 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
24080 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
24090 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61   SQLITE_IOERR, a
240a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78  n SQLITE_IOERR_x
240b0 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53  xx sub-code or S
240c0 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
240d0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
240e0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
240f0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
24100 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
24110 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
24120 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
24130 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
24140 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
24150 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
24160 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
24170 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
24180 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
24190 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
241a0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
241b0 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
241c0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
241d0 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
241e0 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
241f0 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
24200 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
24210 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
24220 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
24230 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
24240 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
24250 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
24260 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
24270 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
24280 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
24290 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
242a0 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
242b0 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
242c0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
242d0 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
242e0 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
242f0 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
24300 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
24310 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
24320 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
24330 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
24340 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
24350 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
24360 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
24370 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
24380 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
24390 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
243a0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
243b0 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
243c0 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
243d0 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
243e0 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
243f0 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
24400 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
24410 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
24420 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
24430 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
24440 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
24450 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
24460 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
24470 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
24480 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
24490 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
244a0 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
244b0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
244c0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
244d0 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
244e0 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a  r *pPager, u32 *
244f0 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
24500 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
24510 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24520 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
24530 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
24540 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67   full assert_pag
24550 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c  er_state() here,
24560 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   as this.  ** fu
24570 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
24580 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
24590 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65   PagerOpen(), be
245a0 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20  fore the state. 
245b0 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72   ** of the Pager
245c0 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72   object is inter
245d0 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
245e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f  ..  **.  ** At o
245f0 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75  ne point this fu
24600 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
24610 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
24620 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20  pager was in .  
24630 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ** PAGER_ERROR s
24640 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20  tate. But since 
24650 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
24660 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
24670 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  t.  ** there is 
24680 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
24690 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
246a0 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75  ference, this fu
246b0 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
246c0 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20   no-op for that 
246d0 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  case anyhow..  *
246e0 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a  /..  u32 pageSiz
246f0 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
24700 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
24710 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
24720 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
24730 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
24740 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
24750 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
24760 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
24770 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26  >dbSize==0).   &
24780 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
24790 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
247a0 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
247b0 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
247c0 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50  ageSize!=(u32)pP
247d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
247e0 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
247f0 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  New = NULL;     
24800 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
24810 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  emp space */.   
24820 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a   i64 nByte = 0;.
24830 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
24840 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
24850 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  EN && isOpen(pPa
24860 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
24870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
24880 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
24890 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
248a0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
248b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
248c0 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
248d0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
248e0 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
248f0 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
24900 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
24910 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  EM_BKPT;.    }..
24920 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
24940 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
24950 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
24960 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50  qlite3PcacheSetP
24970 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ageSize(pPager->
24980 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a  pPCache, pageSiz
24990 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
249a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
249b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
249c0 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
249d0 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
249e0 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
249f0 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
24a00 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
24a10 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74  e = (Pgno)((nByt
24a20 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61  e+pageSize-1)/pa
24a30 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
24a40 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
24a50 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
24a60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
24a70 69 74 65 33 50 61 67 65 46 72 65 65 28 70 4e 65  ite3PageFree(pNe
24a80 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  w);.    }.  }.. 
24a90 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50   *pPageSize = pP
24aa0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
24ab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24ac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  _OK ){.    if( n
24ad0 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73  Reserve<0 ) nRes
24ae0 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e  erve = pPager->n
24af0 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
24b00 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
24b10 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30   && nReserve<100
24b20 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
24b30 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36  >nReserve = (i16
24b40 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70  )nReserve;.    p
24b50 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
24b60 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65  Pager);.    page
24b70 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
24b80 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
24b90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24ba0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
24bb0 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
24bc0 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
24bd0 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
24be0 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
24bf0 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
24c00 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
24c10 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
24c20 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
24c30 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
24c40 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
24c50 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
24c60 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
24c70 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
24c80 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
24c90 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
24ca0 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
24cb0 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
24cc0 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
24cd0 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
24ce0 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
24cf0 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
24d00 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
24d10 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
24d20 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
24d30 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
24d40 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
24d50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
24d60 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
24d70 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
24d80 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
24d90 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
24da0 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
24db0 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
24dc0 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
24dd0 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
24de0 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
24df0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
24e00 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
24e10 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
24e20 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
24e30 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
24e40 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
24e50 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
24e60 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
24e70 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
24e80 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
24e90 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
24ea0 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
24eb0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
24ec0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
24ed0 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Page;.  }.  asse
24ee0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
24ef0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
24f00 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64  ;      /* Called
24f10 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50   only by OP_MaxP
24f20 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74  gcnt */.  assert
24f30 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  ( pPager->mxPgno
24f40 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  >=pPager->dbSize
24f50 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67   );  /* OP_MaxPg
24f60 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69  cnt enforces thi
24f70 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50  s */.  return pP
24f80 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
24f90 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
24fa0 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
24fb0 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
24fc0 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
24fd0 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
24fe0 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
24ff0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
25000 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
25010 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
25020 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
25030 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
25040 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
25050 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
25060 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
25070 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
25080 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
25090 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
250a0 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
250b0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
250c0 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
250d0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
250e0 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
250f0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
25100 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
25110 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
25120 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
25130 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
25140 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
25150 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
25160 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
25170 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
25180 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
25190 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
251a0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
251b0 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
251c0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
251d0 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
251e0 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
251f0 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
25200 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
25210 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
25220 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
25230 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
25240 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
25250 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
25260 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
25270 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
25280 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
25290 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
252a0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
252b0 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ager was opened 
252c0 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  on a transient f
252d0 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ile (zFilename==
252e0 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65  ""), or.** opene
252f0 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73  d on a file less
25300 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e   than N bytes in
25310 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75   size, the outpu
25320 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a  t buffer is.** z
25330 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45  eroed and SQLITE
25340 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
25350 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20  e rationale for 
25360 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
25370 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
25380 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64  s used to read d
25390 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c  atabase headers,
253a0 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73   and a new trans
253b0 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20  ient or.** zero 
253c0 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68  sized database h
253d0 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e  as a header than
253e0 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
253f0 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a  ly of zeroes..**
25400 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72  .** If any IO er
25410 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53  ror apart from S
25420 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
25430 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e  T_READ is encoun
25440 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  tered,.** the er
25450 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
25460 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
25470 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  er and the conte
25480 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75  nts of the.** ou
25490 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65  tput buffer unde
254a0 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  fined..*/.int sq
254b0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
254c0 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
254d0 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
254e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
254f0 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
25500 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
25510 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
25520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
25530 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
25540 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
25550 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ile );..  /* Thi
25560 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
25570 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65  y called by btre
25580 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  e immediately af
25590 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a  ter creating.  *
255a0 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  * the Pager obje
255b0 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e  ct.  There has n
255c0 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72  ot been an oppor
255d0 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69  tunity to transi
255e0 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c  tion.  ** to WAL
255f0 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a   mode yet..  */.
25600 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
25610 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
25620 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  ;..  if( isOpen(
25630 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
25640 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
25650 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
25660 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
25670 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
25680 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
25690 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20  est, N, 0);.    
256a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
256b0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
256c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
256d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
256e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
256f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
25700 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20  nction may only 
25710 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
25720 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
25730 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20  n is open on.** 
25740 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72 65  the pager. It re
25750 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  turns the total 
25760 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
25770 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
25780 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20  .**.** However, 
25790 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62  if the file is b
257a0 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61  etween 1 and <pa
257b0 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69  ge-size> bytes i
257c0 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a  n size, then .**
257d0 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65   this is conside
257e0 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c  red a 1 page fil
257f0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
25800 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
25810 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25820 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
25830 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25840 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
25850 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
25860 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
25870 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  !=PAGER_WRITER_F
25880 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e  INISHED );.  *pn
25890 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67  Page = (int)pPag
258a0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a  er->dbSize;.}...
258b0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
258c0 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
258d0 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74  pe locktype on t
258e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
258f0 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61  . If.** a simila
25900 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  r or greater loc
25910 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
25920 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
25930 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28   is a no-op.** (
25940 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
25950 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29  _OK immediately)
25960 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
25970 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  e, attempt to ob
25980 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73  tain the lock us
25990 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  ing sqlite3OsLoc
259a0 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20  k(). Invoke .** 
259b0 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
259c0 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  k if the lock is
259d0 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
259e0 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74  vailable. Repeat
259f0 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62   .** until the b
25a00 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
25a10 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e  urns false or un
25a20 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20  til the attempt 
25a30 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68  to .** obtain th
25a40 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
25a50 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
25a60 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
25a70 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
25a80 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
25a90 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
25aa0 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63  lock. If the loc
25ab0 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75  k is obtained su
25ac0 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20  ccessfully, set 
25ad0 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20  the Pager.state 
25ae0 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20  .** variable to 
25af0 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20  locktype before 
25b00 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
25b10 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
25b20 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
25b30 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
25b40 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
25b50 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b70 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
25b80 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
25b90 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68  hat this is eith
25ba0 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61  er a no-op (beca
25bb0 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65  use the requeste
25bc0 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20  d lock is .  ** 
25bd0 61 6c 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f  already held), o
25be0 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61  r one of the tra
25bf0 6e 73 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68  nsitions that th
25c00 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20  e busy-handler. 
25c10 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b   ** may be invok
25c20 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72  ed during, accor
25c30 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d  ding to the comm
25c40 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73  ent above.  ** s
25c50 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
25c60 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a  syhandler()..  *
25c70 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61  /.  assert( (pPa
25c80 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b  ger->eLock>=lock
25c90 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  type).       || 
25ca0 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
25cb0 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  NO_LOCK && lockt
25cc0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
25cd0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
25ce0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45  ger->eLock==RESE
25cf0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63  RVED_LOCK && loc
25d00 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
25d10 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64  _LOCK).  );..  d
25d20 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  o {.    rc = pag
25d30 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
25d40 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77   locktype);.  }w
25d50 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
25d60 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d  _BUSY && pPager-
25d70 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  >xBusyHandler(pP
25d80 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
25d90 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75  erArg) );.  retu
25da0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25db0 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54  Function assertT
25dc0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25dd0 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73  t(pPager) checks
25de0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
25df0 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   .** following i
25e00 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  s true for all d
25e10 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65  irty pages curre
25e20 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
25e30 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  -cache:.**.**   
25e40 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  a) The page numb
25e50 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
25e60 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
25e70 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
25e80 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74       current dat
25e90 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20  abase image, in 
25ea0 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20  pages, OR.**.** 
25eb0 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65    b) if the page
25ec0 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72   content were wr
25ed0 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69  itten at this ti
25ee0 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  me, it would not
25ef0 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65  .**      be nece
25f00 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
25f10 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
25f20 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75  nt out to the su
25f30 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  b-journal.**    
25f40 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64    (as determined
25f50 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62   by function sub
25f60 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29  jRequiresPage())
25f70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
25f80 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65  ondition asserte
25f90 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
25fa0 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
25fb0 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72  , and the.** dir
25fc0 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20  ty page were to 
25fd0 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f  be discarded fro
25fe0 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20  m the cache via 
25ff0 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28  the pagerStress(
26000 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61  ).** routine, pa
26010 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c  gerStress() woul
26020 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  d not write the 
26030 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
26040 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64  tent to.** the d
26050 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
26060 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
26070 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f  nsaction were ro
26080 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a  lled back after.
26090 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64  ** this happened
260a0 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  , the correct be
260b0 68 61 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20  havior would be 
260c0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
260d0 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e  urrent.** conten
260e0 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48  t of the page. H
260f0 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68  owever, since th
26100 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  is content is no
26110 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74  t present in eit
26120 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  her.** the datab
26130 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20  ase file or the 
26140 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  portion of the r
26150 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
26160 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  and .** sub-jour
26170 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  nal rolled back 
26180 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c  the content coul
26190 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65  d not be restore
261a0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74  d and the.** dat
261b0 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c  abase image woul
261c0 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
261d0 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72  . It is therefor
261e0 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74  e fortunate that
261f0 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d   .** this circum
26200 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72  stance cannot ar
26210 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ise..*/.#if defi
26220 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
26230 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  ).static void as
26240 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
26250 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a  traintCb(PgHdr *
26260 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
26270 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
26280 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65  _DIRTY );.  asse
26290 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65  rt( !subjRequire
262a0 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50  sPage(pPg) || pP
262b0 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50  g->pgno<=pPg->pP
262c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
262d0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  }.static void as
262e0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
262f0 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50  traint(Pager *pP
26300 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
26310 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
26320 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
26330 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61  he, assertTrunca
26340 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b  teConstraintCb);
26350 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
26360 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
26370 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
26380 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  r).#endif../*.**
26390 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e   Truncate the in
263a0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
263b0 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e   file image to n
263c0 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73  Page pages. This
263d0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f   .** function do
263e0 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
263f0 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
26400 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
26410 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65  . It .** just se
26420 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
26430 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
26440 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  er object so tha
26450 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61  t the .** trunca
26460 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e  tion will be don
26470 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
26480 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
26490 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
264a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
264b0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
264c0 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d  right before com
264d0 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
264e0 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74  ction..** Once t
264f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
26500 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
26510 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e transaction mu
26520 73 74 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20  st either be.** 
26530 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63  rolled back or c
26540 6f 6d 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20  ommitted. It is 
26550 6e 6f 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c  not safe to call
26560 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
26570 6e 64 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69  nd.** then conti
26580 6e 75 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  nue writing to t
26590 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
265a0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
265b0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50  rTruncateImage(P
265c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
265d0 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  no nPage){.  ass
265e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
265f0 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  ize>=nPage );.  
26600 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26610 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
26620 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b  ITER_CACHEMOD );
26630 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
26640 65 20 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a  e = nPage;..  /*
26650 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
26660 65 20 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c  e code here call
26670 65 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ed assertTruncat
26680 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f  eConstraint() to
26690 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61  .  ** ensure tha
266a0 74 20 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e  t all pages bein
266b0 67 20 74 72 75 6e 63 61 74 65 64 20 61 77 61 79  g truncated away
266c0 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
266d0 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20  on are,.  ** if 
266e0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
266f0 70 6f 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c  points are open,
26700 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
26710 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
26720 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
26730 74 68 65 79 20 63 61 6e 20 62 65 20 72 65 73 74  they can be rest
26740 6f 72 65 64 20 69 66 20 74 68 65 20 73 61 76 65  ored if the save
26750 70 6f 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a  point is rolled.
26760 20 20 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20    ** back. This 
26770 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63  is no longer nec
26780 65 73 73 61 72 79 20 61 73 20 74 68 69 73 20 66  essary as this f
26790 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f  unction is now o
267a0 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20  nly.  ** called 
267b0 72 69 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d  right before com
267c0 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
267d0 63 74 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75  ction. So althou
267e0 67 68 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  gh the .  ** Pag
267f0 65 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74  er object may st
26800 69 6c 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61  ill have open sa
26810 76 65 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e  vepoints (Pager.
26820 6e 53 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20  nSavepoint!=0), 
26830 0a 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f  .  ** they canno
26840 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
26850 2e 20 53 6f 20 74 68 65 20 61 73 73 65 72 74 54  . So the assertT
26860 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26870 74 28 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73  t() call.  ** is
26880 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65   no longer corre
26890 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ct. */.}.../*.**
268a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
268b0 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
268c0 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74  attempting a hot
268d0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
268e0 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74  k. It.** syncs t
268f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26900 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65  to disk, then se
26910 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ts pPager->journ
26920 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20  alHdr to the.** 
26930 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
26940 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74  nal file so that
26950 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
26960 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e  ack() routine kn
26970 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ows.** that the 
26980 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66  entire journal f
26990 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
269a0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69  ced..**.** Synci
269b0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
269c0 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20   to disk before 
269d0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
269e0 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72  ll it back ensur
269f0 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61  es .** that if a
26a00 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f   power-failure o
26a10 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
26a20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
26a30 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61  rocess that.** a
26a40 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b  ttempts rollback
26a50 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65   following syste
26a60 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20  m recovery sees 
26a70 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c  the same journal
26a80 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  .** content as t
26a90 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  his process..**.
26aa0 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
26ab0 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64   goes as planned
26ac0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
26ad0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
26ae0 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  se, .** an SQLit
26af0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
26b00 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
26b10 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
26b20 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
26b30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26b40 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61  E_OK;.  if( !pPa
26b50 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
26b60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26b70 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
26b80 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  d, SQLITE_SYNC_N
26b90 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66  ORMAL);.  }.  if
26ba0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26bb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
26bc0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
26bd0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
26be0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
26bf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26c00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  ;.}../*.** Obtai
26c10 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
26c20 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64   a memory mapped
26c30 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72   page object for
26c40 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
26c50 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f  o. .** The new o
26c60 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74  bject will use t
26c70 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61  he pointer pData
26c80 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  , obtained from 
26c90 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20  xFetch()..** If 
26ca0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
26cb0 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74  *ppPage to point
26cc0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
26cd0 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e   reference.** an
26ce0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
26cf0 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  OK. Otherwise, r
26d00 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
26d10 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73  error code and s
26d20 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f  et.** *ppPage to
26d30 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67   zero..**.** Pag
26d40 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74  e references obt
26d50 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ained by calling
26d60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
26d70 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65  hould be release
26d80 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20  d.** by calling 
26d90 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
26da0 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
26db0 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72   int pagerAcquir
26dc0 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67 65  eMapPage(.  Page
26dd0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
26de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
26df0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
26e00 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
26e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
26e30 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  */.  void *pData
26e40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26e50 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29       /* xFetch()
26e60 27 64 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  'd data for this
26e70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
26e80 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20 20   **ppPage       
26e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
26ea0 54 3a 20 41 63 71 75 69 72 65 64 20 70 61 67 65  T: Acquired page
26eb0 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
26ec0 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
26ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ee0 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64  /* Memory mapped
26ef0 20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20   page to return 
26f00 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61 67  */.  .  if( pPag
26f10 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
26f20 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  t ){.    *ppPage
26f30 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70   = p = pPager->p
26f40 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
26f50 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46    pPager->pMmapF
26f60 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69  reelist = p->pDi
26f70 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
26f80 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73  ty = 0;.    mems
26f90 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c  et(p->pExtra, 0,
26fa0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
26fb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
26fc0 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67  ppPage = p = (Pg
26fd0 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  Hdr *)sqlite3Mal
26fe0 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50  locZero(sizeof(P
26ff0 67 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e  gHdr) + pPager->
27000 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28  nExtra);.    if(
27010 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p==0 ){.      s
27020 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
27030 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
27040 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67  )(pgno-1) * pPag
27050 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44  er->pageSize, pD
27060 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ata);.      retu
27070 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
27080 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
27090 70 2d 3e 70 45 78 74 72 61 20 3d 20 28 76 6f 69  p->pExtra = (voi
270a0 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70  d *)&p[1];.    p
270b0 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48 44 52 5f  ->flags = PGHDR_
270c0 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  MMAP;.    p->nRe
270d0 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50  f = 1;.    p->pP
270e0 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
270f0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d   }..  assert( p-
27100 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a  >pExtra==(void *
27110 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65  )&p[1] );.  asse
27120 72 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20  rt( p->pPage==0 
27130 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
27140 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41  flags==PGHDR_MMA
27150 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  P );.  assert( p
27160 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
27170 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
27180 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70  >nRef==1 );..  p
27190 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
271a0 20 70 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74   p->pData = pDat
271b0 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d  a;.  pPager->nMm
271c0 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75  apOut++;..  retu
271d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
271e0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
271f0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
27200 67 65 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74  ge pPg. pPg must
27210 20 68 61 76 65 20 62 65 65 6e 20 72 65 74 75 72   have been retur
27220 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61  ned by an .** ea
27230 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61  rlier call to pa
27240 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
27250 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
27260 6f 69 64 20 70 61 67 65 72 52 65 6c 65 61 73 65  oid pagerRelease
27270 4d 61 70 50 61 67 65 28 50 67 48 64 72 20 2a 70  MapPage(PgHdr *p
27280 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
27290 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
272a0 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d  er;.  pPager->nM
272b0 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d  mapOut--;.  pPg-
272c0 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65 72  >pDirty = pPager
272d0 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
272e0 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  .  pPager->pMmap
272f0 46 72 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a  Freelist = pPg;.
27300 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27310 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  r->fd->pMethods-
27320 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a  >iVersion>=3 );.
27330 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
27340 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ch(pPager->fd, (
27350 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  i64)(pPg->pgno-1
27360 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  )*pPager->pageSi
27370 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b  ze, pPg->pData);
27380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
27390 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73  ll PgHdr objects
273a0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50   stored in the P
273b0 61 67 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69  ager.pMmapFreeli
273c0 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  st list..*/.stat
273d0 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72 65  ic void pagerFre
273e0 65 4d 61 70 48 64 72 73 28 50 61 67 65 72 20 2a  eMapHdrs(Pager *
273f0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
27400 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e   *p;.  PgHdr *pN
27410 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61  ext;.  for(p=pPa
27420 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
27430 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  st; p; p=pNext){
27440 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
27450 70 44 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69  pDirty;.    sqli
27460 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
27470 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  .}.../*.** Shutd
27480 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
27490 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
274a0 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
274b0 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
274c0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
274d0 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
274e0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
274f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
27500 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
27510 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
27520 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
27530 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
27540 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
27550 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
27560 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
27570 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
27580 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
27590 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
275a0 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
275b0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
275c0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
275d0 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
275e0 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
275f0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
27600 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
27610 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
27620 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
27630 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
27640 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
27650 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
27660 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
27670 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
27680 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
27690 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
276a0 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
276b0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
276c0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
276d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
276e0 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
276f0 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54  Pager){.  u8 *pT
27700 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  mp = (u8 *)pPage
27710 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20  r->pTmpSpace;.. 
27720 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
27730 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
27740 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65  er) );.  disable
27750 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
27760 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
27770 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
27780 6f 63 28 29 3b 0a 20 20 70 61 67 65 72 46 72 65  oc();.  pagerFre
27790 65 4d 61 70 48 64 72 73 28 70 50 61 67 65 72 29  eMapHdrs(pPager)
277a0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  ;.  /* pPager->e
277b0 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20  rrCode = 0; */. 
277c0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
277d0 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e  veMode = 0;.#ifn
277e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
277f0 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  WAL.  sqlite3Wal
27800 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57  Close(pPager->pW
27810 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  al, pPager->ckpt
27820 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65  SyncFlags, pPage
27830 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d  r->pageSize, pTm
27840 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57  p);.  pPager->pW
27850 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  al = 0;.#endif. 
27860 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
27870 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  ger);.  if( MEMD
27880 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75  B ){.    pager_u
27890 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
278a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
278b0 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79  f it is open, sy
278c0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
278d0 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
278e0 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  ng UnlockAndRoll
278f0 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20  back..    ** If 
27900 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65  this is not done
27910 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63  , then an unsync
27920 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
27930 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a  e open journal .
27940 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20      ** file may 
27950 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  be played back i
27960 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
27970 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69  . If a power fai
27980 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20  lure occurs .   
27990 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69   ** while this i
279a0 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65  s happening, the
279b0 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
279c0 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a  become corrupt..
279d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
279e0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
279f0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
27a00 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
27a10 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70 61 67  l, shift the pag
27a20 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  er.    ** into t
27a30 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20  he ERROR state. 
27a40 54 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f  This causes Unlo
27a50 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f  ckAndRollback to
27a60 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20   unlock the.    
27a70 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ** database and 
27a80 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
27a90 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  l file without a
27aa0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c  ttempting to rol
27ab0 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b  l it.    ** back
27ac0 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e   or finalize it.
27ad0 20 54 68 65 20 6e 65 78 74 20 64 61 74 61 62 61   The next databa
27ae0 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76  se user will hav
27af0 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72  e to do hot-jour
27b00 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  nal.    ** rollb
27b10 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73  ack before acces
27b20 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  sing the databas
27b30 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
27b40 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
27b50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
27b60 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
27b70 70 50 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e  pPager, pagerSyn
27b80 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
27b90 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
27ba0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
27bb0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
27bc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64    }.  sqlite3End
27bd0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
27be0 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
27bf0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
27c00 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
27c10 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
27c20 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
27c30 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
27c40 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
27c50 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
27c60 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
27c70 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
27c80 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
27c90 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
27ca0 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  pTmp);.  sqlite3
27cb0 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67  PcacheClose(pPag
27cc0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23  er->pPCache);..#
27cd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
27ce0 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61  _CODEC.  if( pPa
27cf0 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
27d00 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ) pPager->xCodec
27d10 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f  Free(pPager->pCo
27d20 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  dec);.#endif..  
27d30 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
27d40 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21  >aSavepoint && !
27d50 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
27d60 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
27d70 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
27d80 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28  jfd) && !isOpen(
27d90 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b  pPager->sjfd) );
27da0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
27db0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
27dc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27dd0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
27de0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
27df0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
27e00 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
27e10 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
27e20 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f  age pPg..*/.Pgno
27e30 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
27e40 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a  enumber(DbPage *
27e50 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
27e60 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64  Pg->pgno;.}.#end
27e70 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
27e80 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
27e90 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65  e count for page
27ea0 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   pPg..*/.void sq
27eb0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
27ec0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71  Page *pPg){.  sq
27ed0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70  lite3PcacheRef(p
27ee0 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  Pg);.}../*.** Sy
27ef0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
27f00 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
27f10 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
27f20 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
27f30 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
27f40 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
27f50 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
27f60 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
27f70 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
27f80 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73  k and can be res
27f90 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  tored in the eve
27fa0 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  nt of a hot-jour
27fb0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  nal rollback..**
27fc0 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72  .** If the Pager
27fd0 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20  .noSync flag is 
27fe0 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  set, then this f
27ff0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
28000 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  op..** Otherwise
28010 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65  , the actions re
28020 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e  quired depend on
28030 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
28040 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65  e and the .** de
28050 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
28060 74 69 63 73 20 6f 66 20 74 68 65 20 66 69 6c 65  tics of the file
28070 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
28080 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
28090 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
280a0 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
280b0 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
280c0 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
280d0 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
280e0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
280f0 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
28100 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
28110 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
28120 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
28130 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
28140 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
28150 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
28160 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
28170 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
28180 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
28190 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
281a0 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
281b0 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
281c0 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
281d0 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
281e0 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
281f0 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
28200 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
28210 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
28220 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
28230 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
28240 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
28250 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
28260 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
28270 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
28280 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
28290 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
282a0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
282b0 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
282c0 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
282d0 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
282e0 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
282f0 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
28300 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
28310 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
28320 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
28330 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
28340 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
28350 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
28360 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
28370 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
28380 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
28390 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
283a0 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
283b0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
283c0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
283d0 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f  lears the PGHDR_
283e0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
283f0 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65  f every .** page
28400 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
28410 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65  in memory before
28420 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
28430 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a  E_OK. If an IO.*
28440 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  * error is encou
28450 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65  ntered, then the
28460 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
28470 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
28480 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
28490 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
284a0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
284b0 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a  r, int newHdr){.
284c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
284f0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
28500 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
28510 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
28520 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
28530 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
28540 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
28550 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
28560 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
28570 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
28580 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
28590 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
285a0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
285b0 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
285c0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
285d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
285e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
285f0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
28600 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
28610 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
28620 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
28630 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
28640 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  fd) && pPager->j
28650 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
28660 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
28670 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f  MORY ){.      co
28680 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71  nst int iDc = sq
28690 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
286a0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
286b0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
286c0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
286d0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
286e0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
286f0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
28700 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
28710 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
28720 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20  lock deals with 
28730 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c  an obscure probl
28740 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20  em. If the last 
28750 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20  connection.     
28760 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65     ** that wrote
28770 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
28780 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20  e was operating 
28790 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f  in persistent-jo
287a0 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
287b0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
287c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
287d0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61   at this point a
287e0 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65  ctually be large
287f0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  r.        ** tha
28800 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  n Pager.journalO
28810 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65  ff bytes. If the
28820 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74   next thing in t
28830 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
28840 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65     ** file happe
28850 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e  ns to be a journ
28860 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74  al-header (writt
28870 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  en as part of th
28880 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
28890 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  vious connection
288a0 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  's transaction),
288b0 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20   and a crash or 
288c0 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20  power-failure . 
288d0 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73         ** occurs
288e0 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75   after nRec is u
288f0 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72  pdated but befor
28900 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  e this connectio
28910 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20  n writes .      
28920 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c    ** anything el
28930 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  se to the journa
28940 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69  l file (or commi
28950 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74  ts/rolls back it
28960 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  s .        ** tr
28970 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e  ansaction), then
28980 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f   SQLite may beco
28990 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e  me confused when
289a0 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20   doing the .    
289b0 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
289c0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  al rollback foll
289d0 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20  owing recovery. 
289e0 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b  It may roll back
289f0 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
28a00 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
28a10 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70  ons data, then p
28a20 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e  roceed to rollin
28a30 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a  g back the old,.
28a40 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f          ** out-o
28a50 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74  f-date data that
28a60 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74   follows it. Dat
28a70 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
28a80 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
28a90 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20       ** To work 
28aa0 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
28ab0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28ac0 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20   does appear to 
28ad0 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20  contain.        
28ae0 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65  ** a valid heade
28af0 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65  r following Page
28b00 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68  r.journalOff, th
28b10 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a  en write a 0x00.
28b20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20          ** byte 
28b30 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
28b40 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  it to prevent it
28b50 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f   from being reco
28b60 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20  gnized..        
28b70 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61  **.        ** Va
28b80 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f  riable iNextHdrO
28b90 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20  ffset is set to 
28ba0 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68  the offset at wh
28bb0 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20  ich this.       
28bc0 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20   ** problematic 
28bd0 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75  header will occu
28be0 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  r, if it exists.
28bf0 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20   aMagic is used 
28c00 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61  .        ** as a
28c10 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
28c20 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65  r to inspect the
28c30 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66   first couple of
28c40 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20   bytes of.      
28c50 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69    ** the potenti
28c60 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  al journal heade
28c70 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
28c80 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48        i64 iNextH
28c90 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  drOffset;.      
28ca0 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a    u8 aMagic[8];.
28cb0 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64          u8 zHead
28cc0 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
28cd0 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20  alMagic)+4];..  
28ce0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65        memcpy(zHe
28cf0 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
28d00 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
28d10 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
28d20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26       put32bits(&
28d30 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
28d40 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
28d50 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
28d60 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72          iNextHdr
28d70 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c  Offset = journal
28d80 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
28d90 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
28da0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
28db0 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
28dc0 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66  c, 8, iNextHdrOf
28dd0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  fset);.        i
28de0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28df0 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d   && 0==memcmp(aM
28e00 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
28e10 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
28e20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
28e30 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
28e40 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
28e50 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
28e60 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
28e70 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78  erobyte, 1, iNex
28e80 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
28e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
28ea0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28eb0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
28ec0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
28ed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
28ee0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
28ef0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
28f00 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
28f10 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
28f20 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
28f30 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
28f40 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
28f50 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
28f60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
28f70 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
28f80 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
28f90 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
28fa0 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
28fb0 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
28fc0 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
28fd0 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
28fe0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
28ff0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
29000 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
29010 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
29020 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
29030 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
29040 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
29050 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
29060 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
29070 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
29080 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
29090 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
290a0 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
290b0 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
290c0 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
290d0 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
290e0 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
290f0 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
29100 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
29110 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
29120 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
29130 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
29140 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
29150 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29160 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
29170 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
29180 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
29190 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
291a0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
291b0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
291c0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
291d0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
291e0 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
291f0 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
29200 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
29210 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
29220 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
29230 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
29240 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
29250 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29260 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
29270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29280 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
29290 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
292a0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
292b0 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20  rnalHdr));.     
292c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
292d0 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20  sWrite(.        
292e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c      pPager->jfd,
292f0 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66   zHeader, sizeof
29300 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65  (zHeader), pPage
29310 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20  r->journalHdr.  
29320 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29330 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29340 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
29350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
29360 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
29370 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
29380 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
29390 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
293a0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
293b0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
293c0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  )));.        IOT
293d0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
293e0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
293f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29400 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
29410 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
29420 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  cFlags| .       
29430 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
29440 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59  Flags==SQLITE_SY
29450 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53  NC_FULL?SQLITE_S
29460 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a  YNC_DATAONLY:0).
29470 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
29480 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29490 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
294a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
294b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
294c0 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
294d0 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20  urnalOff;.      
294e0 69 66 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d  if( newHdr && 0=
294f0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
29500 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
29510 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
29520 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
29530 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
29540 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
29550 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29560 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
29570 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29580 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
29590 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
295a0 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
295b0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
295c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65  }.  }..  /* Unle
295d0 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
295e0 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20  in noSync mode, 
295f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29600 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20   was just .  ** 
29610 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e  successfully syn
29620 63 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ced. Either way,
29630 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
29640 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
29650 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67  on .  ** all pag
29660 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  es..  */.  sqlit
29670 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e  e3PcacheClearSyn
29680 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70  cFlags(pPager->p
29690 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65  PCache);.  pPage
296a0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
296b0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a  R_WRITER_DBMOD;.
296c0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
296d0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
296e0 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
296f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
29700 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
29710 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  t is the first i
29720 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
29730 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63  of dirty pages c
29740 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74  onnected.** by t
29750 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
29760 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75  pointer. This fu
29770 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61  nction writes ea
29780 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  ch one of the.**
29790 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
297a0 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20   in the list to 
297b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
297c0 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  e. The argument 
297d0 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20  may.** be NULL, 
297e0 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
297f0 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74  empty list. In t
29800 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75  his case this fu
29810 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e  nction is.** a n
29820 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
29830 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  pager must hold 
29840 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
29850 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68  VED lock when th
29860 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
29870 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65  s called. Before
29880 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e   writing anythin
29890 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
298a0 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63  e file, this loc
298b0 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64  k.** is upgraded
298c0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
298d0 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
298e0 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
298f0 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  ained,.** SQLITE
29900 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
29910 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73  d and no data is
29920 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
29930 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
29940 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  * .** If the pag
29950 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  er is a temp-fil
29960 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20  e pager and the 
29970 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74  actual file-syst
29980 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f  em file.** is no
29990 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69  t yet open, it i
299a0 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70  s created and op
299b0 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ened before any 
299c0 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74  data is .** writ
299d0 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ten out..**.** O
299e0 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  nce the lock has
299f0 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61   been upgraded a
29a00 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
29a10 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  , the file opene
29a20 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20  d,.** the pages 
29a30 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20  are written out 
29a40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
29a50 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64  file in list ord
29a60 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61  er. Writing.** a
29a70 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64   page is skipped
29a80 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74   if it meets eit
29a90 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  her of the follo
29aa0 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a  wing criteria:.*
29ab0 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
29ac0 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61  e number is grea
29ad0 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64  ter than Pager.d
29ae0 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a  bSize, or.**   *
29af0 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   The PGHDR_DONT_
29b00 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65  WRITE flag is se
29b10 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
29b20 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20  *.** If writing 
29b30 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65  out a page cause
29b40 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
29b50 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67  ile to grow, Pag
29b60 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  er.dbFileSize.**
29b70 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f   is updated acco
29b80 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65  rdingly. If page
29b90 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75   1 is written ou
29ba0 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
29bb0 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50  e cached.** in P
29bc0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
29bd0 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  ] is updated to 
29be0 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61  match the new va
29bf0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
29c00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29c10 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
29c20 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
29c30 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
29c40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
29c50 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
29c60 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
29c70 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
29c80 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
29c90 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
29ca0 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62   cannot.** be ob
29cb0 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42  tained, SQLITE_B
29cc0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
29cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
29ce0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
29cf0 69 73 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ist(Pager *pPage
29d00 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29  r, PgHdr *pList)
29d10 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
29d20 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
29d30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
29d40 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
29d50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
29d60 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f  s only called fo
29d70 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72  r rollback pager
29d80 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f  s in WRITER_DBMO
29d90 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73  D state. */.  as
29da0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
29db0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
29dc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29dd0 74 65 6d 70 46 69 6c 65 20 7c 7c 20 70 50 61 67  tempFile || pPag
29de0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
29df0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29  R_WRITER_DBMOD )
29e00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29e10 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
29e20 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  SIVE_LOCK );.  a
29e30 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
29e40 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 4c 69  ager->fd) || pLi
29e50 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 29 3b  st->pDirty==0 );
29e60 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
29e70 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  le is a temp-fil
29e80 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
29e90 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
29ea0 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20  it now. It.  ** 
29eb0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
29ec0 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68  for rc to be oth
29ed0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
29ee0 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68  K if this branch
29ef0 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20  .  ** is taken, 
29f00 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  as pager_wait_on
29f10 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  _lock() is a no-
29f20 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65  op for temp-file
29f30 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
29f40 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
29f50 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
29f60 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
29f70 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
29f80 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
29f90 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
29fa0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ger, pPager->fd,
29fb0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
29fc0 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  s);.  }..  /* Be
29fd0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
29fe0 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56  rite, give the V
29ff0 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61  FS a hint of wha
2a000 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a  t the final.  **
2a010 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20   file size will 
2a020 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  be..  */.  asser
2a030 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2a040 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
2a050 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20  r->fd) );.  if( 
2a060 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
2a070 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48    && pPager->dbH
2a080 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  intSize<pPager->
2a090 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c  dbSize.   && (pL
2a0a0 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70  ist->pDirty || p
2a0b0 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  List->pgno>pPage
2a0c0 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20  r->dbHintSize). 
2a0d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2a0e0 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70  int64 szFile = p
2a0f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
2a100 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  * (sqlite3_int64
2a110 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
2a120 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
2a130 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
2a140 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
2a150 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
2a160 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20  , &szFile);.    
2a170 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
2a180 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
2a190 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ize;.  }..  whil
2a1a0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2a1b0 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
2a1c0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69   Pgno pgno = pLi
2a1d0 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f  st->pgno;..    /
2a1e0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
2a1f0 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
2a200 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
2a210 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
2a220 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
2a230 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
2a240 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
2a250 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
2a260 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c  Image() was call
2a270 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
2a280 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
2a290 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
2a2a0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
2a2b0 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
2a2c0 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
2a2d0 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
2a2e0 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
2a2f0 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20  ** Also, do not 
2a300 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61  write out any pa
2a310 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ge that has the 
2a320 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
2a330 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74   flag.    ** set
2a340 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33   (set by sqlite3
2a350 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29  PagerDontWrite()
2a360 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
2a370 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
2a380 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c  dbSize && 0==(pL
2a390 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
2a3a0 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a  _DONT_WRITE) ){.
2a3b0 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
2a3c0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
2a3d0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
2a3e0 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  e;   /* Offset t
2a3f0 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  o write */.     
2a400 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20   char *pData;   
2a410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a430 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65  /* Data to write
2a440 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61   */    ..      a
2a450 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66  ssert( (pList->f
2a460 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2a470 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
2a480 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
2a490 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69  o==1 ) pager_wri
2a4a0 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
2a4b0 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20  (pList);..      
2a4c0 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61  /* Encode the da
2a4d0 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
2a4e0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
2a4f0 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e  List->pData, pgn
2a500 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 6, return SQL
2a510 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20  ITE_NOMEM_BKPT, 
2a520 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  pData);..      /
2a530 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20  * Write out the 
2a540 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20  page data. */.  
2a550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a560 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2a570 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
2a580 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
2a590 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  set);..      /* 
2a5a0 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75  If page 1 was ju
2a5b0 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  st written, upda
2a5c0 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  te Pager.dbFileV
2a5d0 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20  ers to match.   
2a5e0 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
2a5f0 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68  now stored in th
2a600 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2a610 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73   If writing this
2a620 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20   .      ** page 
2a630 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62  caused the datab
2a640 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
2a650 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53  , update dbFileS
2a660 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ize. .      */. 
2a670 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31       if( pgno==1
2a680 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
2a690 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
2a6a0 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
2a6b0 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
2a6c0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
2a6d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a6e0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
2a6f0 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
2a700 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2a710 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
2a720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2a730 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
2a740 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b  ER_STAT_WRITE]++
2a750 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
2a760 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62  te any backup ob
2a770 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68  jects copying th
2a780 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2a790 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20  is pager. */.   
2a7a0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
2a7b0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
2a7c0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
2a7d0 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29  8*)pList->pData)
2a7e0 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  ;..      PAGERTR
2a7f0 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70  ACE(("STORE %d p
2a800 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
2a810 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
2a820 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
2a830 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
2a840 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
2a850 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49  List)));.      I
2a860 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
2a870 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
2a880 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50   pgno));.      P
2a890 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
2a8a0 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
2a8b0 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73  count);.    }els
2a8c0 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
2a8d0 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
2a8e0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
2a8f0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
2a900 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
2a910 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
2a920 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  sh(pList);.    p
2a930 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
2a940 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  irty;.  }..  ret
2a950 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a960 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   Ensure that the
2a970 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
2a980 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74  e is open. If it
2a990 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
2a9a0 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
2a9b0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2a9c0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
2a9d0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
2a9e0 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
2a9f0 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e  ccording to plan
2aa00 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  . An .** SQLITE_
2aa10 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
2aa20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2aa30 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   if a call to sq
2aa40 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a  lite3OsOpen() .*
2aa50 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * fails..*/.stat
2aa60 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f  ic int openSubJo
2aa70 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
2aa80 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2aa90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
2aaa0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
2aab0 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 63  ->sjfd) ){.    c
2aac0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
2aad0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55    SQLITE_OPEN_SU
2aae0 42 4a 4f 55 52 4e 41 4c 20 7c 20 53 51 4c 49 54  BJOURNAL | SQLIT
2aaf0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2ab00 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45   .      | SQLITE
2ab10 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
2ab20 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
2ab30 53 49 56 45 20 0a 20 20 20 20 20 20 7c 20 53 51  SIVE .      | SQ
2ab40 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
2ab50 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 69 6e 74  ONCLOSE;.    int
2ab60 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 73 71   nStmtSpill = sq
2ab70 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d  lite3Config.nStm
2ab80 74 53 70 69 6c 6c 3b 0a 20 20 20 20 69 66 28 20  tSpill;.    if( 
2ab90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2aba0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2abb0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c  ALMODE_MEMORY ||
2abc0 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
2abd0 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 6e  emory ){.      n
2abe0 53 74 6d 74 53 70 69 6c 6c 20 3d 20 2d 31 3b 0a  StmtSpill = -1;.
2abf0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
2ac00 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
2ac10 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
2ac20 30 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  0, pPager->sjfd,
2ac30 20 66 6c 61 67 73 2c 20 6e 53 74 6d 74 53 70 69   flags, nStmtSpi
2ac40 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ll);.  }.  retur
2ac50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2ac60 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
2ac70 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
2ac80 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
2ac90 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
2aca0 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  al. .**.** If su
2acb0 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
2acc0 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
2acd0 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
2ace0 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
2acf0 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
2ad00 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
2ad10 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
2ad20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2ad30 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2ad40 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
2ad50 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
2ad60 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
2ad70 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
2ad80 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
2ad90 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
2ada0 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
2adb0 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
2adc0 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
2add0 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
2ade0 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
2adf0 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
2ae00 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
2ae10 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
2ae20 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
2ae30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
2ae40 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2ae50 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
2ae60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2ae70 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
2ae80 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20  LMODE_OFF ){..  
2ae90 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75    /* Open the su
2aea0 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  b-journal, if it
2aeb0 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
2aec0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a   been opened */.
2aed0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2aee0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2aef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
2af00 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2af10 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  ) || pagerUseWal
2af20 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2af30 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2af40 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20  Pager->sjfd) || 
2af50 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d  pPager->nSubRec=
2af60 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2af70 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
2af80 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20  ager) .         
2af90 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  || pageInJournal
2afa0 28 70 50 61 67 65 72 2c 20 70 50 67 29 20 0a 20  (pPager, pPg) . 
2afb0 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e          || pPg->
2afc0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f  pgno>pPager->dbO
2afd0 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a  rigSize .    );.
2afe0 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62      rc = openSub
2aff0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
2b000 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2b010 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  sub-journal was 
2b020 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66 75  opened successfu
2b030 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65  lly (or was alre
2b040 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a  ady open),.    *
2b050 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72  * write the jour
2b060 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  nal record into 
2b070 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20  the file.  */.  
2b080 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b090 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69  _OK ){.      voi
2b0a0 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e  d *pData = pPg->
2b0b0 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34  pData;.      i64
2b0c0 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70   offset = (i64)p
2b0d0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28  Pager->nSubRec*(
2b0e0 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
2b0f0 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  ze);.      char 
2b100 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20  *pData2;.  .    
2b110 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2b120 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
2b130 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
2b140 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20  ITE_NOMEM_BKPT, 
2b150 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50  pData2);.      P
2b160 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54  AGERTRACE(("STMT
2b170 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
2b180 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2b190 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2b1a0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  no));.      rc =
2b1b0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
2b1c0 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65  ger->sjfd, offse
2b1d0 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
2b1e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2b1f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b200 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2b210 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  Write(pPager->sj
2b220 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
2b230 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
2b240 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d  fset+4);.      }
2b250 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2b260 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b270 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  {.    pPager->nS
2b280 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73  ubRec++;.    ass
2b290 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
2b2a0 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20  vepoint>0 );.   
2b2b0 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70   rc = addToSavep
2b2c0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
2b2d0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
2b2e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2b2f0 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  .}.static int su
2b300 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65  bjournalPageIfRe
2b310 71 75 69 72 65 64 28 50 67 48 64 72 20 2a 70 50  quired(PgHdr *pP
2b320 67 29 7b 0a 20 20 69 66 28 20 73 75 62 6a 52 65  g){.  if( subjRe
2b330 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
2b340 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 75  ){.    return su
2b350 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
2b360 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2b370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b380 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2b390 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2b3a0 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63  called by the pc
2b3b0 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20  ache layer when 
2b3c0 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73  it has reached s
2b3d0 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f  ome.** soft memo
2b3e0 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69  ry limit. The fi
2b3f0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
2b400 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50  a pointer to a P
2b410 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28  ager object.** (
2b420 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29  cast as a void*)
2b430 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61  . The pager is a
2b440 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65  lways 'purgeable
2b450 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  ' (not an in-mem
2b460 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29  ory.** database)
2b470 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
2b480 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72  ument is a refer
2b490 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74  ence to a page t
2b4a0 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65  hat is .** curre
2b4b0 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68  ntly dirty but h
2b4c0 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
2b4d0 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68  g references. Th
2b4e0 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77  e page.** is alw
2b4f0 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ays associated w
2b500 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62  ith the Pager ob
2b510 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
2b520 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67  he first .** arg
2b530 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ument..**.** The
2b540 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e   job of this fun
2b550 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65  ction is to make
2b560 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72   pPg clean by wr
2b570 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e  iting its conten
2b580 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65  ts.** out to the
2b590 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2b5a0 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69  if possible. Thi
2b5b0 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79  s may involve sy
2b5c0 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncing the.** jou
2b5d0 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  rnal file. .**.*
2b5e0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2b5f0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2b600 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c  keClean() is cal
2b610 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20  led on the page 
2b620 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
2b630 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2b640 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2b650 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
2b660 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67   make the.** pag
2b670 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20  e clean, the IO 
2b680 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2b690 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70  turned. If the p
2b6a0 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  age cannot be.**
2b6b0 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20   made clean for 
2b6c0 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f  some other reaso
2b6d0 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  n, but no error 
2b6e0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c  occurs, then SQL
2b6f0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
2b700 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
2b710 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2b720 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e  ) is not called.
2b730 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2b740 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20  agerStress(void 
2b750 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  *p, PgHdr *pPg){
2b760 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2b770 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20   = (Pager *)p;. 
2b780 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b790 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
2b7a0 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
2b7b0 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
2b7c0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2b7d0 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a  R_DIRTY );..  /*
2b7e0 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
2b7f0 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
2b800 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77  t during times w
2b810 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63  hen doing a sync
2b820 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   of.  ** journal
2b830 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e   (and adding a n
2b840 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f  ew header) is no
2b850 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73  t allowed.  This
2b860 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
2b870 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ing calls to sql
2b880 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2b890 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
2b8a0 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c   journal multipl
2b8b0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c  e.  ** pages bel
2b8c0 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61  onging to the sa
2b8d0 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a  me sector..  **.
2b8e0 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    ** The doNotSp
2b8f0 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64  ill ROLLBACK and
2b900 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62 69   OFF bits inhibi
2b910 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69  ts all cache spi
2b920 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72  lling.  ** regar
2b930 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2b940 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69   or not a sync i
2b950 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69  s required.  Thi
2b960 73 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a  s is set during.
2b970 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
2b980 6f 72 20 62 79 20 75 73 65 72 20 72 65 71 75 65  or by user reque
2b990 73 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  st, respectively
2b9a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c  ..  **.  ** Spil
2b9b0 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f  ling is also pro
2b9c0 68 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20  hibited when in 
2b9d0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73  an error state s
2b9e0 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a  ince that could.
2b9f0 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74    ** lead to dat
2ba00 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
2ba10 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65  .   In the curre
2ba20 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
2ba30 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d  n it .  ** is im
2ba40 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c  possible for sql
2ba50 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
2ba60 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77  ) to be called w
2ba70 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d  ith createFlag==
2ba80 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20  3.  ** while in 
2ba90 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
2baa0 20 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70   hence it is imp
2bab0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73  ossible for this
2bac0 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a   routine to.  **
2bad0 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68   be called in th
2bae0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20  e error state.  
2baf0 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65  Nevertheless, we
2bb00 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52   include a NEVER
2bb10 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72  ().  ** test for
2bb20 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2bb30 20 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20   as a safeguard 
2bb40 61 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63  against future c
2bb50 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  hanges..  */.  i
2bb60 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
2bb70 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
2bb80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2bb90 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2bba0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2bbb0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
2bbc0 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  K );.  testcase(
2bbd0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2bbe0 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2bbf0 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73  OFF );.  testcas
2bc00 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2bc10 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2bc20 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66  G_NOSYNC );.  if
2bc30 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2bc40 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61  pill.   && ((pPa
2bc50 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2bc60 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c  & (SPILLFLAG_ROL
2bc70 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f  LBACK|SPILLFLAG_
2bc80 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c  OFF))!=0.      |
2bc90 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  | (pPg->flags & 
2bca0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2bcb0 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  !=0).  ){.    re
2bcc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bcd0 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72    }..  pPg->pDir
2bce0 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61  ty = 0;.  if( pa
2bcf0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2bd00 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74  ) ){.    /* Writ
2bd10 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65  e a single frame
2bd20 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74   for this page t
2bd30 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20  o the log. */.  
2bd40 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
2bd50 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28  lPageIfRequired(
2bd60 70 50 67 29 3b 20 0a 20 20 20 20 69 66 28 20 72  pPg); .    if( r
2bd70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bd80 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2bd90 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
2bda0 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  , pPg, 0, 0);.  
2bdb0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a    }.  }else{.  .
2bdc0 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
2bdd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
2bde0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
2bdf0 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
2be00 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2be10 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  .     || pPager-
2be20 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
2be30 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
2be40 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
2be50 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
2be60 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ger, 1);.    }. 
2be70 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
2be80 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2be90 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
2bea0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2beb0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  . */.    if( rc=
2bec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bed0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67      assert( (pPg
2bee0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2bef0 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
2bf00 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2bf10 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
2bf20 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20  Pager, pPg);.   
2bf30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72   }.  }..  /* Mar
2bf40 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
2bf50 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ean. */.  if( rc
2bf60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2bf70 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2bf80 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25  STRESS %d page %
2bf90 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2bfa0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2bfb0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ));.    sqlite3P
2bfc0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
2bfd0 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
2bfe0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
2bff0 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a  Pager, rc); .}..
2c000 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20  /*.** Flush all 
2c010 75 6e 72 65 66 65 72 65 6e 63 65 64 20 64 69 72  unreferenced dir
2c020 74 79 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b  ty pages to disk
2c030 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2c040 50 61 67 65 72 46 6c 75 73 68 28 50 61 67 65 72  PagerFlush(Pager
2c050 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2c060 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
2c070 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 21 4d 45  rCode;.  if( !ME
2c080 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72  MDB ){.    PgHdr
2c090 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   *pList = sqlite
2c0a0 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
2c0b0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2c0c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
2c0d0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
2c0e0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  e(pPager) );.   
2c0f0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2c100 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
2c110 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
2c120 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  Next = pList->pD
2c130 69 72 74 79 3b 0a 20 20 20 20 20 20 69 66 28 20  irty;.      if( 
2c140 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30 20 29  pList->nRef==0 )
2c150 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
2c160 61 67 65 72 53 74 72 65 73 73 28 28 76 6f 69 64  agerStress((void
2c170 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 29  *)pPager, pList)
2c180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c190 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pList = pNext;. 
2c1a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
2c1b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c1c0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
2c1d0 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
2c1e0 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
2c1f0 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
2c200 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
2c210 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
2c220 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
2c230 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
2c240 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
2c250 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
2c260 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
2c270 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
2c280 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
2c290 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2c2a0 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
2c2b0 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
2c2c0 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
2c2d0 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
2c2e0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
2c2f0 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
2c300 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
2c310 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
2c320 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
2c330 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
2c340 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
2c350 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
2c360 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
2c370 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
2c380 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2c390 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
2c3a0 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
2c3b0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
2c3c0 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
2c3d0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
2c3e0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2c3f0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
2c400 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
2c410 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
2c420 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2c430 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
2c440 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
2c450 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
2c460 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
2c470 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
2c480 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
2c490 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
2c4a0 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
2c4b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
2c4c0 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
2c4d0 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
2c4e0 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
2c4f0 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
2c500 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
2c510 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
2c520 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
2c530 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
2c540 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
2c550 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  _* flags..**.** 
2c560 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72  The vfsFlags par
2c570 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
2c580 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74  ask to pass to t
2c590 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2c5a0 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70  er.** of the xOp
2c5b0 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  en() method of t
2c5c0 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20  he supplied VFS 
2c5d0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c  when opening fil
2c5e0 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es. .**.** If th
2c5f0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e pager object i
2c600 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
2c610 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2c620 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75  le opened .** su
2c630 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49  ccessfully, SQLI
2c640 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2c650 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73  d and *ppPager s
2c660 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
2c670 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20  * the new pager 
2c680 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
2c690 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50  ror occurs, *ppP
2c6a0 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e  ager is set to N
2c6b0 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72  ULL.** and error
2c6c0 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
2c6d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2c6e0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2c6f0 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65  NOMEM.** (sqlite
2c700 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65  3Malloc() is use
2c710 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
2c720 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41  mory), SQLITE_CA
2c730 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61  NTOPEN or .** va
2c740 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f  rious SQLITE_IO_
2c750 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69  XXX errors..*/.i
2c760 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
2c770 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
2c780 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2c790 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
2c7a0 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
2c7b0 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
2c7c0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2c7d0 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74  /* OUT: Return t
2c7e0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2c7f0 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2c800 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2c810 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
2c820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c830 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2c840 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
2c850 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2c860 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
2c870 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
2c880 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
2c890 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2c8a0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
2c8b0 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
2c8c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
2c8d0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2c8e0 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
2c8f0 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
2c900 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2c910 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2c920 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a  nit)(DbPage*) /*
2c930 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69   Function to rei
2c940 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20  nitialize pages 
2c950 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
2c960 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2c970 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
2c980 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  Pager object to 
2c990 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  allocate and ret
2c9a0 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
2c9b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2c9c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2c9d0 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   */.  int tempFi
2c9e0 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  le = 0;        /
2c9f0 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20  * True for temp 
2ca00 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d  files (incl. in-
2ca10 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f  memory files) */
2ca20 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
2ca30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2ca40 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2ca50 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2ca60 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   */.  int readOn
2ca70 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ly = 0;        /
2ca80 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2ca90 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69  s a read-only fi
2caa0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72  le */.  int jour
2cab0 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20  nalFileSize;    
2cac0 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2cad0 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a  ocate for each j
2cae0 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63  ournal fd */.  c
2caf0 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
2cb00 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20   0;     /* Full 
2cb10 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65  path to database
2cb20 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
2cb30 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2cb40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2cb50 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e   bytes in zPathn
2cb60 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ame */.  int use
2cb70 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
2cb80 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
2cb90 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61  URNAL)==0; /* Fa
2cba0 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72  lse to omit jour
2cbb0 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61  nal */.  int pca
2cbc0 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
2cbd0 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20  3PcacheSize();  
2cbe0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2cbf0 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43   allocate for PC
2cc00 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ache */.  u32 sz
2cc10 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2cc20 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2cc30 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74  IZE;  /* Default
2cc40 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
2cc50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
2cc60 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20   = 0;    /* URI 
2cc70 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  args to copy */.
2cc80 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20    int nUri = 0; 
2cc90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2cca0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2ccb0 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55   URI args at *zU
2ccc0 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ri */..  /* Figu
2ccd0 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  re out how much 
2cce0 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65  space is require
2ccf0 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  d for each journ
2cd00 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20  al file-handle. 
2cd10 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74   ** (there are t
2cd20 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20  wo of them, the 
2cd30 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
2cd40 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2cd50 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61 6c  ).  */.  journal
2cd60 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
2cd70 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  8(sqlite3Journal
2cd80 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 0a 20 20  Size(pVfs));..  
2cd90 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
2cda0 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
2cdb0 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  LL in case an er
2cdc0 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
2cdd0 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
2cde0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2cdf0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69  MIT_MEMORYDB.  i
2ce00 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52  f( flags & PAGER
2ce10 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d  _MEMORY ){.    m
2ce20 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66  emDb = 1;.    if
2ce30 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2ce40 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2ce50 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d       zPathname =
2ce60 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2ce70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  (0, zFilename);.
2ce80 20 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e        if( zPathn
2ce90 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e  ame==0  ) return
2cea0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2ceb0 50 54 3b 0a 20 20 20 20 20 20 6e 50 61 74 68 6e  PT;.      nPathn
2cec0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
2ced0 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
2cee0 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  ;.      zFilenam
2cef0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
2cf00 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
2cf10 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20  mpute and store 
2cf20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
2cf30 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65  e in an allocate
2cf40 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  d buffer pointed
2cf50 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74  .  ** to by zPat
2cf60 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50  hname, length nP
2cf70 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20  athname. Or, if 
2cf80 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
2cf90 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c  ary file,.  ** l
2cfa0 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e  eave both nPathn
2cfb0 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d  ame and zPathnam
2cfc0 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f  e set to 0..  */
2cfd0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
2cfe0 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2cff0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2d000 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68  ar *z;.    nPath
2d010 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
2d020 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a  athname+1;.    z
2d030 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2d040 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c  e3DbMallocRaw(0,
2d050 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20   nPathname*2);. 
2d060 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
2d070 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
2d080 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d090 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2d0a0 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
2d0b0 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
2d0c0 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
2d0d0 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
2d0e0 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
2d0f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
2d100 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
2d110 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
2d120 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
2d130 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  );.    nPathname
2d140 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2d150 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2d160 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a     z = zUri = &z
2d170 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33  Filename[sqlite3
2d180 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
2d190 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c  me)+1];.    whil
2d1a0 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a  e( *z ){.      z
2d1b0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
2d1c0 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20  n30(z)+1;.      
2d1d0 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2d1e0 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d  en30(z)+1;.    }
2d1f0 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74  .    nUri = (int
2d200 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b  )(&z[1] - zUri);
2d210 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55 72  .    assert( nUr
2d220 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
2d230 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d240 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
2d250 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
2d260 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
2d270 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
2d280 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2d290 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
2d2a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
2d2b0 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
2d2c0 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
2d2d0 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
2d2e0 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
2d2f0 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
2d300 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
2d310 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
2d320 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
2d330 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
2d340 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
2d350 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
2d360 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
2d370 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
2d380 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2d390 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
2d3a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d3b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2d3c0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
2d3d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d3e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d3f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2d400 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2d410 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d420 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
2d430 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
2d440 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  r the Pager stru
2d450 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62  cture, PCache ob
2d460 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74  ject, the.  ** t
2d470 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69  hree file descri
2d480 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62  ptors, the datab
2d490 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ase file name an
2d4a0 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  d the journal . 
2d4b0 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54   ** file name. T
2d4c0 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d  he layout in mem
2d4d0 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ory is as follow
2d4e0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
2d4f0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20   Pager object   
2d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d510 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20   (sizeof(Pager) 
2d520 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2d530 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20  PCache object   
2d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d550 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69  (sqlite3PcacheSi
2d560 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ze() bytes).  **
2d570 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2d580 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2d590 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73       (pVfs->szOs
2d5a0 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  File bytes).  **
2d5b0 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c       Sub-journal
2d5c0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2d5d0 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
2d5e0 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
2d5f0 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e  *     Main journ
2d600 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2d610 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2d620 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2d630 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2d640 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2d650 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
2d660 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e+1 bytes).  ** 
2d670 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
2d680 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2d690 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38      (nPathname+8
2d6a0 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20  +1 bytes).  */. 
2d6b0 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71   pPtr = (u8 *)sq
2d6c0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2d6d0 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65  .    ROUND8(size
2d6e0 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20  of(*pPager)) +  
2d6f0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
2d700 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f  ucture */.    RO
2d710 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2d720 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
2d730 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
2d740 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73  .    ROUND8(pVfs
2d750 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20  ->szOsFile) +   
2d760 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
2d770 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
2d780 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
2d790 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a   2 +          /*
2d7a0 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c   The two journal
2d7b0 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e   files */ .    n
2d7c0 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2d7d0 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  Uri +         /*
2d7e0 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20   zFilename */.  
2d7f0 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20    nPathname + 8 
2d800 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20  + 2             
2d810 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a   /* zJournal */.
2d820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d830 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50  MIT_WAL.    + nP
2d840 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20  athname + 4 + 2 
2d850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57             /* zW
2d860 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29  al */.#endif.  )
2d870 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2d880 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2d890 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50  (SQLITE_INT_TO_P
2d8a0 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  TR(journalFileSi
2d8b0 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70  ze)) );.  if( !p
2d8c0 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Ptr ){.    sqlit
2d8d0 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2d8e0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
2d8f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2d900 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67  BKPT;.  }.  pPag
2d910 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
2d920 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
2d930 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
2d940 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
2d950 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2d960 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2d970 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
2d980 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
2d990 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2d9a0 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2d9b0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
2d9c0 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
2d9d0 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2d9e0 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2d9f0 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
2da00 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
2da10 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
2da20 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2da30 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2da40 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
2da50 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2da60 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
2da70 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2da80 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
2da90 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
2daa0 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
2dab0 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
2dac0 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
2dad0 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
2dae0 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
2daf0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61  athname ){.    a
2db00 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65  ssert( nPathname
2db10 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  >0 );.    pPager
2db20 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
2db30 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
2db40 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2db50 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2db60 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2db70 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
2db80 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
2db90 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79  f( nUri ) memcpy
2dba0 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  (&pPager->zFilen
2dbb0 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
2dbc0 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
2dbd0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2dbe0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
2dbf0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2dc00 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2dc10 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2dc20 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
2dc30 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29  urnal\000", 8+2)
2dc40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
2dc50 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d  eSuffix3(pPager-
2dc60 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2dc70 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23  er->zJournal);.#
2dc80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2dc90 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65  IT_WAL.    pPage
2dca0 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65  r->zWal = &pPage
2dcb0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2dcc0 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20  hname+8+1];.    
2dcd0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2dce0 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  Wal, zPathname, 
2dcf0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2dd00 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2dd10 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  zWal[nPathname],
2dd20 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31   "-wal\000", 4+1
2dd30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2dd40 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2dd50 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2dd60 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64  ger->zWal);.#end
2dd70 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  if.    sqlite3Db
2dd80 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2dd90 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
2dda0 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2ddb0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
2ddc0 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
2ddd0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
2dde0 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
2ddf0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2de00 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2de10 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20  .    int fout = 
2de20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2de30 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2de40 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  gs returned by x
2de50 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63  Open() */.    rc
2de60 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2de70 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2de80 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2de90 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20  ->fd, vfsFlags, 
2dea0 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65  &fout);.    asse
2deb0 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20  rt( !memDb );.  
2dec0 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
2ded0 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2dee0 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
2def0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
2df00 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
2df10 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
2df20 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
2df30 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
2df40 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2df50 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
2df60 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
2df70 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
2df80 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
2df90 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
2dfa0 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
2dfb0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
2dfc0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2dfd0 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
2dfe0 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
2dff0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2e000 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
2e010 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2e020 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
2e030 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
2e040 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
2e050 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
2e060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e070 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63  ){.      int iDc
2e080 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
2e090 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2e0a0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
2e0b0 20 20 20 20 20 69 66 28 20 21 72 65 61 64 4f 6e       if( !readOn
2e0c0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  ly ){.        se
2e0d0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2e0e0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
2e0f0 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ert(SQLITE_DEFAU
2e100 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51  LT_PAGE_SIZE<=SQ
2e110 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2e120 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
2e130 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
2e140 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
2e150 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
2e160 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2e170 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54  sectorSize>SQLIT
2e180 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2e190 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  GE_SIZE ){.     
2e1a0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2e1b0 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
2e1c0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e1d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2e1e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
2e1f0 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32  zPageDflt = (u32
2e200 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  )pPager->sectorS
2e210 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ize;.          }
2e220 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65  .        }.#ifde
2e230 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2e240 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2e250 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2e260 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
2e270 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2e280 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
2e290 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
2e2a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2e2b0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2e2c0 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
2e2d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
2e2e0 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
2e2f0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e300 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
2e310 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
2e320 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
2e330 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2e340 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
2e350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2e360 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
2e370 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
2e380 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
2e390 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2e3a0 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
2e3b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2e3c0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
2e3d0 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
2e3e0 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
2e3f0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2e400 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  lean(zFilename, 
2e410 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20  "nolock", 0);.  
2e420 20 20 20 20 69 66 28 20 28 69 44 63 20 26 20 53      if( (iDc & S
2e430 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55  QLITE_IOCAP_IMMU
2e440 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20 20  TABLE)!=0.      
2e450 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   || sqlite3_uri_
2e460 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d  boolean(zFilenam
2e470 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20  e, "immutable", 
2e480 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
2e490 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  vfsFlags |= SQLI
2e4a0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2e4b0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2e4c0 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66   act_like_temp_f
2e4d0 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ile;.      }.   
2e4e0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2e4f0 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
2e500 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
2e510 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
2e520 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
2e530 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
2e540 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
2e550 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
2e560 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
2e570 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
2e580 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
2e590 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
2e5a0 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
2e5b0 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
2e5c0 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
2e5d0 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
2e5e0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2e5f0 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
2e600 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
2e610 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
2e620 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
2e630 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
2e640 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
2e650 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
2e660 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
2e670 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
2e680 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2e690 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72 75  s branch also ru
2e6a0 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61 72  ns for files mar
2e6b0 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c 65  ked as immutable
2e6c0 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69  ..    */ .act_li
2e6d0 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20  ke_temp_file:.  
2e6e0 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
2e6f0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
2e700 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
2e710 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e  R;     /* Preten
2e720 64 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  d we already hav
2e730 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  e a lock */.    
2e740 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
2e750 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20  EXCLUSIVE_LOCK; 
2e760 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2e770 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49 56   are in EXCLUSIV
2e780 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50  E mode */.    pP
2e790 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31  ager->noLock = 1
2e7a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e7b0 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e   /* Do no lockin
2e7c0 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c  g */.    readOnl
2e7d0 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
2e7e0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2e7f0 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
2e800 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
2e810 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
2e820 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
2e830 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
2e840 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
2e850 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
2e860 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
2e870 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
2e880 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
2e890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e8a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e8b0 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
2e8c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e8d0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2e8e0 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
2e8f0 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
2e900 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
2e910 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
2e920 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2e930 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
2e940 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
2e950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e960 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31  assert( nExtra<1
2e970 30 30 30 20 29 3b 0a 20 20 20 20 6e 45 78 74 72  000 );.    nExtr
2e980 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72  a = ROUND8(nExtr
2e990 61 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  a);.    rc = sql
2e9a0 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
2e9b0 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
2e9c0 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
2e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9e0 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74    !memDb?pagerSt
2e9f0 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29  ress:0, (void *)
2ea00 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2ea10 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20  pPCache);.  }.. 
2ea20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2ea30 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 20  occurred above, 
2ea40 66 72 65 65 20 74 68 65 20 20 50 61 67 65 72 20  free the  Pager 
2ea50 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
2ea60 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  ose the file..  
2ea70 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  */.  if( rc!=SQL
2ea80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2ea90 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
2eaa0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
2eab0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
2eac0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
2ead0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2eae0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
2eaf0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2eb00 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f    PAGERTRACE(("O
2eb10 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
2eb20 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65  LEHANDLEID(pPage
2eb30 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e  r->fd), pPager->
2eb40 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49  zFilename));.  I
2eb50 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
2eb60 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
2eb70 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2eb80 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75  e))..  pPager->u
2eb90 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  seJournal = (u8)
2eba0 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a  useJournal;.  /*
2ebb0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
2ebc0 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
2ebd0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
2ebe0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2ebf0 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
2ec00 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2ec10 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
2ec20 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2ec30 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
2ec40 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
2ec50 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
2ec60 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
2ec70 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
2ec80 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
2ec90 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2eca0 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20  UNLOCK; */.  /* 
2ecb0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
2ecc0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2ecd0 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38  ->tempFile = (u8
2ece0 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73  )tempFile;.  ass
2ecf0 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50  ert( tempFile==P
2ed00 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2ed10 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20  _NORMAL .       
2ed20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d     || tempFile==
2ed30 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2ed40 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
2ed50 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
2ed60 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2ed70 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61  SIVE==1 );.  pPa
2ed80 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2ed90 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  de = (u8)tempFil
2eda0 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  e; .  pPager->ch
2edb0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
2edc0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2edd0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  ;.  pPager->memD
2ede0 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  b = (u8)memDb;. 
2edf0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
2ee00 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79  y = (u8)readOnly
2ee10 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a  ;.  assert( useJ
2ee20 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72  ournal || pPager
2ee30 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
2ee40 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
2ee50 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2ee60 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  e;.  if( pPager-
2ee70 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  >noSync ){.    a
2ee80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
2ee90 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  ullSync==0 );.  
2eea0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2eeb0 2d 3e 65 78 74 72 61 53 79 6e 63 3d 3d 30 20 29  ->extraSync==0 )
2eec0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2eed0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
2eee0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2eef0 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e  ( pPager->walSyn
2ef00 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  cFlags==0 );.   
2ef10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ef20 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d  >ckptSyncFlags==
2ef30 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
2ef40 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
2ef50 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  nc = 1;.    pPag
2ef60 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20  er->extraSync = 
2ef70 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
2ef80 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2ef90 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
2efa0 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
2efb0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2efc0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57  _SYNC_NORMAL | W
2efd0 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54  AL_SYNC_TRANSACT
2efe0 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72  IONS;.    pPager
2eff0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
2f000 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2f010 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  RMAL;.  }.  /* p
2f020 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
2f030 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2f040 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
2f050 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2f060 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
2f070 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
2f080 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72  tra = (u16)nExtr
2f090 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
2f0a0 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
2f0b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
2f0c0 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
2f0d0 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  T;.  assert( isO
2f0e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2f0f0 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  || tempFile );. 
2f100 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
2f110 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75  Pager);.  if( !u
2f120 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
2f130 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2f140 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
2f150 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20  RNALMODE_OFF;.  
2f160 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20  }else if( memDb 
2f170 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2f180 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2f190 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2f1a0 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  EMORY;.  }.  /* 
2f1b0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
2f1c0 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
2f1d0 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
2f1e0 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a  andlerArg = 0; *
2f1f0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  /.  pPager->xRei
2f200 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
2f210 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
2f220 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
2f230 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
2f240 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70  ash)); */.  /* p
2f250 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20  Pager->szMmap = 
2f260 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d  SQLITE_DEFAULT_M
2f270 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c  MAP_SIZE // will
2f280 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65 65   be set by btree
2f290 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65  .c */..  *ppPage
2f2a0 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
2f2b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f2c0 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
2f2d0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
2f2e0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20  file has not be 
2f2f0 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d  deleted or renam
2f300 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75  ed out from.** u
2f310 6e 64 65 72 20 74 68 65 20 70 61 67 65 72 2e 20  nder the pager. 
2f320 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2f330 4b 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  K if the databas
2f340 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20  e is still were 
2f350 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62  it ought.** to b
2f360 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75  e on disk.  Retu
2f370 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c  rn non-zero (SQL
2f380 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
2f390 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68  OVED or some oth
2f3a0 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  er error.** code
2f3b0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41   from sqlite3OsA
2f3c0 63 63 65 73 73 28 29 29 20 69 66 20 74 68 65 20  ccess()) if the 
2f3d0 64 61 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e  database has gon
2f3e0 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74  e missing..*/.st
2f3f0 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73  atic int databas
2f400 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72  eIsUnmoved(Pager
2f410 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2f420 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a   bHasMoved = 0;.
2f430 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
2f440 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2f450 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
2f460 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
2f470 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20  er->dbSize==0 ) 
2f480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f490 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2f4a0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26  er->zFilename &&
2f4b0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2f4c0 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20  me[0] );.  rc = 
2f4d0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
2f4e0 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
2f4f0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41   SQLITE_FCNTL_HA
2f500 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f  S_MOVED, &bHasMo
2f510 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ved);.  if( rc==
2f520 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
2f530 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
2f540 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d   HAS_MOVED file-
2f550 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70  control is unimp
2f560 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65  lemented, assume
2f570 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20   that the file. 
2f580 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
2f590 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20  en moved.  That 
2f5a0 69 73 20 74 68 65 20 68 69 73 74 6f 72 69 63 61  is the historica
2f5b0 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51  l behavior of SQ
2f5c0 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20  Lite: prior to. 
2f5d0 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
2f5e0 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68  8.3, it never ch
2f5f0 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20  ecked */.    rc 
2f600 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2f610 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2f620 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f  ITE_OK && bHasMo
2f630 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ved ){.    rc = 
2f640 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
2f650 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72  DBMOVED;.  }.  r
2f660 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2f670 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2f680 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  n is called afte
2f690 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  r transitioning 
2f6a0 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  from PAGER_UNLOC
2f6b0 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48  K to.** PAGER_SH
2f6c0 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74  ARED state. It t
2f6d0 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73  ests if there is
2f6e0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70   a hot journal p
2f6f0 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
2f700 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2f710 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
2f720 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  . A hot journal 
2f730 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20  is one that .** 
2f740 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
2f750 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69  ed back. Accordi
2f760 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ng to this funct
2f770 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ion, a hot-journ
2f780 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74  al.** file exist
2f790 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
2f7a0 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20  ng criteria are 
2f7b0 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  met:.**.**   * T
2f7c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f7d0 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
2f7e0 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a  le system, and.*
2f7f0 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73  *   * No process
2f800 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
2f810 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
2f820 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2f830 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  e file, and.**  
2f840 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
2f850 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67  file itself is g
2f860 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79  reater than 0 by
2f870 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64  tes in size, and
2f880 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73  .**   * The firs
2f890 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f  t byte of the jo
2f8a0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2f8b0 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30  s and is not 0x0
2f8c0 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
2f8d0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
2f8e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f8f0 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
2f900 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
2f910 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
2f920 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
2f930 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
2f940 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
2f950 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
2f960 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74   same name. In t
2f970 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
2f980 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
2f990 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69  just deleted usi
2f9a0 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45  ng OsDelete, *pE
2f9b0 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
2f9c0 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a  0 and SQLITE_OK.
2f9d0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
2f9e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2f9f0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63  ne does not chec
2fa00 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  k if there is a 
2fa10 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2fa20 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68  ilename.** at th
2fa30 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
2fa40 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  e. If there is, 
2fa50 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20  and that master 
2fa60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2fa70 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2fa80 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
2fa90 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
2faa0 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73  lly hot. In this
2fab0 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f  .** case this ro
2fac0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
2fad0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2fae0 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c  ve. The pager_pl
2faf0 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  ayback().** rout
2fb00 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
2fb10 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  r that the journ
2fb20 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
2fb30 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a  eally hot and .*
2fb40 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
2fb50 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20  it back. .**.** 
2fb60 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  If a hot-journal
2fb70 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74   file is found t
2fb80 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74  o exist, *pExist
2fb90 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e  s is set to 1 an
2fba0 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d .** SQLITE_OK 
2fbb0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20  returned. If no 
2fbc0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2fbd0 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45   is present, *pE
2fbe0 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20  xists is.** set 
2fbf0 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
2fc00 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2fc10 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2fc20 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a  rs while trying.
2fc30 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
2fc40 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2fc50 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2fc60 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f  e exists, the IO
2fc70 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69   error.** code i
2fc80 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
2fc90 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78  he value of *pEx
2fca0 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65  ists is undefine
2fcb0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2fcc0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
2fcd0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
2fce0 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73  t *pExists){.  s
2fcf0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
2fd00 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
2fd10 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
2fd20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2fd30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2fd40 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2fd50 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20  exists = 1;     
2fd60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2fd70 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  e if a journal f
2fd80 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ile is present *
2fd90 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e  /.  int jrnlOpen
2fda0 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67   = !!isOpen(pPag
2fdb0 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73  er->jfd);..  ass
2fdc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2fdd0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
2fde0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2fdf0 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
2fe00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
2fe10 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
2fe20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72  );..  assert( jr
2fe30 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73  nlOpen==0 || ( s
2fe40 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2fe50 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2fe60 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20  ager->jfd) &.   
2fe70 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
2fe80 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
2fe90 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45  PEN.  ));..  *pE
2fea0 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28  xists = 0;.  if(
2feb0 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2fec0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2fed0 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
2fee0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
2fef0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2ff00 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
2ff10 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2ff20 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
2ff30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b   ){.    int lock
2ff40 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
2ff50 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
2ff60 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  ome process hold
2ff70 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
2ff80 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63  k */..    /* Rac
2ff90 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65  e condition here
2ffa0 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65  :  Another proce
2ffb0 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  ss might have be
2ffc0 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  en holding the. 
2ffd0 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56     ** the RESERV
2ffe0 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65  ED lock and have
2fff0 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20   a journal open 
30000 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  at the sqlite3Os
30010 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a  Access() .    **
30020 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74   call above, but
30030 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65   then delete the
30040 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f   journal and dro
30050 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72  p the lock befor
30060 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20  e.    ** we get 
30070 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
30080 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
30090 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61  eservedLock() ca
300a0 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20  ll.  If that.   
300b0 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c   ** is the case,
300c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
300d0 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20  ght think there 
300e0 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
300f0 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20   when.    ** in 
30100 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f  fact there is no
30110 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74  ne.  This result
30120 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  s in a false-pos
30130 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c  itive which will
30140 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74  .    ** be dealt
30150 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61   with by the pla
30160 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20  yback routine.  
30170 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20  Ticket #3883..  
30180 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
30190 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
301a0 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
301b0 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20  >fd, &locked);. 
301c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
301d0 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20  E_OK && !locked 
301e0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  ){.      Pgno nP
301f0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
30200 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30210 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
30220 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
30230 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
30240 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
30250 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
30260 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
30270 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
30280 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30290 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
302a0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
302b0 73 65 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73  se is zero pages
302c0 20 69 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d   in size, that m
302d0 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
302e0 20 28 31 29 20 74 68 65 0a 20 20 20 20 20 20 20   (1) the.       
302f0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61   ** journal is a
30300 20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20   remnant from a 
30310 70 72 69 6f 72 20 64 61 74 61 62 61 73 65 20 77  prior database w
30320 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
30330 65 20 77 68 65 72 65 0a 20 20 20 20 20 20 20 20  e where.        
30340 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
30350 66 69 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65  file but not the
30360 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c   journal was del
30370 65 74 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65  eted, or (2) the
30380 20 69 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20   initial.       
30390 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
303a0 74 68 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61  that populates a
303b0 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
303c0 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
303d0 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  ck..        ** I
303e0 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74  n either case, t
303f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30400 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20  can be deleted. 
30410 20 48 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63   However, take c
30420 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  are.        ** n
30430 6f 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  ot to delete the
30440 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
30450 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f   it is already o
30460 70 65 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20  pen due to.     
30470 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f     ** journal_mo
30480 64 65 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20  de=PERSIST..    
30490 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
304a0 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21  f( nPage==0 && !
304b0 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
304c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
304d0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
304e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
304f0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
30500 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
30510 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  K)==SQLITE_OK ){
30520 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
30530 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
30540 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
30550 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  nal, 0);.       
30560 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
30570 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
30580 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  ) pagerUnlockDb(
30590 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
305a0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
305b0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
305c0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
305d0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  oc();.        }e
305e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
305f0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
30600 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f  le exists and no
30610 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
30620 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64  n has a reserved
30630 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
30640 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
30650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30660 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68  le. Now check th
30670 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20  at there is.    
30680 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73        ** at leas
30690 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62  t one non-zero b
306a0 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72  ytes at the star
306b0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
306c0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20   file..         
306d0 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c   ** If there is,
306e0 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65   then we conside
306f0 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74  r this journal t
30700 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74  o be hot. If not
30710 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
30720 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  it can be ignore
30730 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  d..          */.
30740 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
30750 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
30760 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
30770 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
30780 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
30790 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
307a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
307b0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
307c0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
307d0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
307e0 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20  , f, &f);.      
307f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30800 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30810 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
30820 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20   u8 first = 0;. 
30830 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
30840 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
30850 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64  ager->jfd, (void
30860 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29   *)&first, 1, 0)
30870 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
30880 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
30890 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
308a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
308b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
308c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
308d0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
308e0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
308f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
30900 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
30910 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
30920 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a   }.            *
30930 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74  pExists = (first
30940 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  !=0);.          
30950 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
30960 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
30970 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
30980 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65  If we cannot ope
30990 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
309a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f  ournal file in o
309b0 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20  rder to see if. 
309c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
309d0 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64   has a zero head
309e0 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62  er, that might b
309f0 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20  e due to an I/O 
30a00 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20  error, or.      
30a10 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
30a20 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20  t be due to the 
30a30 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64  race condition d
30a40 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61  escribed above a
30a50 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  nd in.          
30a60 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38    ** ticket #388
30a70 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  3.  Either way, 
30a80 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
30a90 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a  journal is hot..
30aa0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54              ** T
30ab0 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66  his might be a f
30ac0 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20  alse positive.  
30ad0 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68  But if it is, th
30ae0 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  en the.         
30af0 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20     ** automatic 
30b00 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
30b10 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65   and recovery me
30b20 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61  chanism will dea
30b30 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  l.            **
30b40 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61   with it under a
30b50 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
30b60 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
30b70 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
30b80 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f       ** worry so
30b90 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20   much with race 
30ba0 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20  conditions..    
30bb0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30bc0 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
30bd0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
30be0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30bf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30c00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30c10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
30c20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
30c30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
30c40 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
30c50 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
30c60 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
30c70 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69  file..** It is i
30c80 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73  llegal to call s
30c90 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
30ca0 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69   until after thi
30cb0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  s function.** ha
30cc0 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
30cd0 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61  lly called. If a
30ce0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
30cf0 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65  already held whe
30d00 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
30d10 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
30d20 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
30d30 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
30d40 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
30d50 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62  also performed b
30d60 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
30d70 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74  .**.**   1) If t
30d80 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
30d90 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f  ently in PAGER_O
30da0 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f  PEN state (no lo
30db0 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20  ck held.**      
30dc0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
30dd0 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61  file), then an a
30de0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
30df0 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20  o obtain a.**   
30e00 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f     SHARED lock o
30e10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
30e20 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79  ile. Immediately
30e30 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
30e40 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41  .**      the SHA
30e50 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69  RED lock, the fi
30e60 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65  le-system is che
30e70 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a  cked for a hot-j
30e80 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20  ournal,.**      
30e90 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20  which is played 
30ea0 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e  back if present.
30eb0 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68   Following any h
30ec0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  ot-journal .**  
30ed0 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68      rollback, th
30ee0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
30ef0 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69  e cache are vali
30f00 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e  dated by checkin
30f10 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63  g.**      the 'c
30f20 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66  hange-counter' f
30f30 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61  ield of the data
30f40 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
30f50 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73   and.**      dis
30f60 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61  carded if they a
30f70 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69  re found to be i
30f80 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  nvalid..**.**   
30f90 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  2) If the pager 
30fa0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
30fb0 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e  clusive-mode, an
30fc0 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72  d there are curr
30fd0 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f  ently.**      no
30fe0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
30ff0 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70  erences to any p
31000 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20  ages, and is in 
31010 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
31020 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e  .**      then an
31030 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
31040 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72   to clear the er
31050 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73  ror state by dis
31060 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  carding.**      
31070 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
31080 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61  the page cache a
31090 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  nd rolling back 
310a0 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  any open journal
310b0 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a  .**      file..*
310c0 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
310d0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
310e0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
310f0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
31100 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
31110 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67  rs while locking
31120 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63   the database, c
31130 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f  hecking for a ho
31140 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  t-journal file o
31150 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61  r .** rolling ba
31160 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
31170 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  e, the IO error 
31180 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
31190 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
311a0 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
311b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
311c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
311d0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
311e0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
311f0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
31200 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
31210 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d  y called from b-
31220 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68  tree and only wh
31230 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  en there are no.
31240 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67    ** outstanding
31250 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70   pages. This imp
31260 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70 61  lies that the pa
31270 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64  ger state should
31280 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20   either.  ** be 
31290 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20  OPEN or READER. 
312a0 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70  READER is only p
312b0 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 70  ossible if the p
312c0 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20 69  ager is or was i
312d0 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76  n .  ** exclusiv
312e0 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 20 20  e access mode.  
312f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
31300 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
31310 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
31320 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  he)==0 );.  asse
31330 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
31340 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
31350 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31360 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
31370 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
31380 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
31390 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
313a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
313b0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
313c0 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55  ;..  if( !pagerU
313d0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
313e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
313f0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
31400 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e     int bHotJourn
31410 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  al = 1;         
31420 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72   /* True if ther
31430 65 20 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a  e exists a hot j
31440 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a  ournal-file */..
31450 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
31460 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
31470 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
31480 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
31490 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
314a0 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 72  E_LOCK );..    r
314b0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
314c0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
314d0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
314e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
314f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
31500 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
31510 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50  k==NO_LOCK || pP
31520 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
31530 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
31540 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
31550 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
31560 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
31570 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
31580 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
31590 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
315a0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
315b0 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
315c0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
315d0 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
315e0 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
315f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
31600 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
31610 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  ){.      rc = ha
31620 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
31630 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c  er, &bHotJournal
31640 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
31650 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31660 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  {.      goto fai
31670 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
31680 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29  f( bHotJournal )
31690 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
316a0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
316b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
316c0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
316d0 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67  LBACK;.        g
316e0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
316f0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
31700 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
31710 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
31720 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
31730 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
31740 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
31750 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
31760 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
31770 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
31780 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
31790 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
317a0 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
317b0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
317c0 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
317d0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
317e0 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
317f0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
31800 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
31810 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
31820 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
31830 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
31840 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
31850 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
31860 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
31870 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
31880 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
31890 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
318a0 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
318b0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
318c0 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
318d0 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
318e0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
318f0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
31900 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
31910 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
31920 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
31930 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
31940 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
31950 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
31960 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
31970 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
31980 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
31990 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
319a0 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
319b0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
319c0 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
319d0 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
319e0 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
319f0 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
31a00 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
31a10 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31a20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
31a30 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
31a40 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
31a50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31a60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
31a70 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
31a80 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
31a90 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
31aa0 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
31ab0 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
31ac0 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
31ad0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
31ae0 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
31af0 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
31b00 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
31b10 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
31b20 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
31b30 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
31b40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
31b50 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
31b60 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
31b70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
31b80 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
31b90 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
31ba0 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
31bb0 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
31bc0 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
31bd0 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
31be0 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
31bf0 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
31c00 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
31c10 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
31c20 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
31c30 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
31c40 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
31c50 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
31c60 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
31c70 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
31c80 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
31c90 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
31ca0 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
31cb0 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
31cc0 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
31cd0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
31ce0 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
31cf0 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
31d00 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
31d10 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
31d20 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
31d30 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
31d40 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
31d50 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
31d60 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
31d70 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
31d80 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
31d90 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
31da0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
31db0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
31dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
31dd0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
31de0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
31df0 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
31e00 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
31e10 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
31e20 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
31e30 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
31e40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
31e50 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
31e60 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
31e70 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
31e80 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
31e90 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
31ea0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31eb0 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
31ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
31ed0 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
31ee0 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
31ef0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
31f00 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
31f10 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
31f20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31f30 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
31f40 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
31f50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
31f60 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
31f70 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
31f80 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
31f90 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
31fa0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
31fb0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
31fc0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
31fd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31fe0 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
31ff0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
32000 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
32010 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32020 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
32030 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
32040 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
32050 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
32060 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
32070 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
32080 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
32090 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
320a0 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
320b0 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
320c0 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
320d0 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
320e0 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
320f0 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
32100 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
32110 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
32120 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
32130 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
32140 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
32150 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
32160 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
32170 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
32180 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
32190 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
321a0 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
321b0 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
321c0 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
321d0 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
321e0 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
321f0 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
32200 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
32210 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
32220 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
32230 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
32240 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
32250 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
32260 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
32270 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
32280 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
32290 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e     rc = pagerSyn
322a0 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
322b0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
322c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
322d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
322e0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
322f0 70 50 61 67 65 72 2c 20 21 70 50 61 67 65 72 2d  pPager, !pPager-
32300 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
32310 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
32320 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
32330 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
32340 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
32350 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
32360 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
32370 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
32380 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
32390 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
323a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
323b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
323c0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
323d0 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72   taken if an err
323e0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
323f0 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20  trying to open. 
32400 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c         ** or rol
32410 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  l back a hot-jou
32420 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69  rnal while holdi
32430 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
32440 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
32450 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    ** pager_unloc
32460 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
32470 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
32480 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75  e returning to u
32490 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a  nlock.        **
324a0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
324b0 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74  e unlock attempt
324c0 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67   fails, then Pag
324d0 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er.eLock must be
324e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
324f0 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
32500 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  (see the comment
32510 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
32520 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20  ne for .        
32530 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
32540 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70  above for an exp
32550 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20  lanation). .    
32560 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
32570 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  * In order to ge
32580 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  t pager_unlock()
32590 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74   to do this, set
325a0 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
325b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45  .        ** PAGE
325c0 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69  R_ERROR now. Thi
325d0 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
325e0 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74  y counted as a t
325f0 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20  ransition.      
32600 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74    ** to ERROR st
32610 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  ate in the state
32620 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20   diagram at the 
32630 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
32640 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e  ,.        ** sin
32650 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ce we know that 
32660 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f  the same call to
32670 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
32680 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20  will very.      
32690 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61    ** shortly tra
326a0 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65  nsition the page
326b0 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
326c0 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c  OPEN state. Call
326d0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
326e0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
326f0 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e  e() would fail n
32700 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64  ow, as it should
32710 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
32720 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
32730 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  e in ERROR state
32740 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
32750 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  zero outstanding
32760 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a   page .        *
32770 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20  * references..  
32780 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
32790 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
327a0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
327b0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
327c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
327d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
327e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
327f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
32800 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
32810 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
32820 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
32830 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
32840 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
32850 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
32860 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
32870 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
32880 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 70  r->tempFile && p
32890 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
328a0 61 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  aredLock ){.    
328b0 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
328c0 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
328d0 65 6e 20 61 63 71 75 69 72 65 64 20 74 68 65 6e  en acquired then
328e0 20 63 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20   check to.      
328f0 2a 2a 20 73 65 65 20 69 66 20 74 68 65 20 64 61  ** see if the da
32900 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
32910 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68  modified.  If th
32920 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63  e database has c
32930 68 61 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a  hanged,.      **
32940 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
32950 2e 20 20 54 68 65 20 68 61 73 48 65 6c 64 53 68  .  The hasHeldSh
32960 61 72 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72  aredLock flag pr
32970 65 76 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d  events this from
32980 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72  .      ** occurr
32990 69 6e 67 20 6f 6e 20 74 68 65 20 76 65 72 79 20  ing on the very 
329a0 66 69 72 73 74 20 61 63 63 65 73 73 20 74 6f 20  first access to 
329b0 61 20 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72  a file, in order
329c0 20 74 6f 20 73 61 76 65 20 61 0a 20 20 20 20 20   to save a.     
329d0 20 2a 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63   ** single unnec
329e0 65 73 73 61 72 79 20 73 71 6c 69 74 65 33 4f 73  essary sqlite3Os
329f0 52 65 61 64 28 29 20 63 61 6c 6c 20 61 74 20 74  Read() call at t
32a00 68 65 20 73 74 61 72 74 2d 75 70 2e 0a 20 20 20  he start-up..   
32a10 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44     **.      ** D
32a20 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
32a30 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
32a40 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
32a50 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
32a60 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
32a70 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
32a80 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
32a90 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
32aa0 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
32ab0 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
32ac0 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
32ad0 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
32ae0 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
32af0 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
32b00 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
32b10 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
32b20 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
32b30 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
32b40 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
32b50 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
32b60 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
32b70 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
32b80 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
32b90 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
32ba0 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
32bb0 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
32bc0 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
32bd0 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
32be0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
32bf0 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
32c00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67       */.      Pg
32c10 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  no nPage = 0;.  
32c20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56      char dbFileV
32c30 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65  ers[sizeof(pPage
32c40 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b  r->dbFileVers)];
32c50 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ..      rc = pag
32c60 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
32c70 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
32c80 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
32c90 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20   failed;..      
32ca0 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
32cb0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
32cc0 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
32cd0 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
32ce0 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
32cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32d00 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
32d10 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
32d20 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
32d30 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
32d40 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32d50 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
32d60 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
32d70 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
32d80 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
32d90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32da0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
32db0 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
32dc0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
32dd0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
32de0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
32df0 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
32e00 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
32e10 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
32e20 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
32e30 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
32e40 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  t(pPager);..    
32e50 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65      /* Unmap the
32e60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
32e70 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
32e80 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f  hat external pro
32e90 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a  cesses.        *
32ea0 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63  * may have trunc
32eb0 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61 73  ated the databas
32ec0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20  e file and then 
32ed0 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b  extended it back
32ee0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69  .        ** to i
32ef0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
32f00 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
32f10 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64  ess was not hold
32f20 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20  ing a lock..    
32f30 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
32f40 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65 78  ase there may ex
32f50 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70  ist a Pager.pMap
32f60 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61 70   mapping that ap
32f70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a  pears.        **
32f80 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68 74   to be the right
32f90 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74   size but is not
32fa0 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e   actually valid.
32fb0 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20   Avoid this.    
32fc0 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69      ** possibili
32fd0 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20  ty by unmapping 
32fe0 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a  the db here. */.
32ff0 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45 46          if( USEF
33000 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a  ETCH(pPager) ){.
33010 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33020 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
33030 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
33040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33050 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
33060 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20   there is a WAL 
33070 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
33080 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68  -system, open th
33090 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57  is database in W
330a0 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20  AL.    ** mode. 
330b0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66  Otherwise, the f
330c0 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
330d0 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  n call is a no-o
330e0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  p..    */.    rc
330f0 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49   = pagerOpenWalI
33100 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29  fPresent(pPager)
33110 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
33120 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73  _OMIT_WAL.    as
33130 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
33140 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  al==0 || rc==SQL
33150 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66  ITE_OK );.#endif
33160 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65  .  }..  if( page
33170 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
33180 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
33190 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
331a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65      rc = pagerBe
331b0 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
331c0 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  on(pPager);.  }.
331d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
331e0 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20 70 50  empFile==0 && pP
331f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
33200 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d  GER_OPEN && rc==
33210 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33220 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
33230 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50  ount(pPager, &pP
33240 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
33250 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69   }.. failed:.  i
33260 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33270 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
33280 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
33290 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
332a0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
332b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
332c0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
332d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
332e0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
332f0 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50  R_READER;.    pP
33300 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
33310 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d  redLock = 1;.  }
33320 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33330 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  ./*.** If the re
33340 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61  ference count ha
33350 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20  s reached zero, 
33360 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  rollback any act
33370 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
33380 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  on and unlock th
33390 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45  e pager..**.** E
333a0 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e  xcept, in lockin
333b0 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
333c0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
333d0 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20  othing to in.** 
333e0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
333f0 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b  rnal, the unlock
33400 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65   is not performe
33410 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a  d and there is.*
33420 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c  * nothing to rol
33430 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72  lback, so this r
33440 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
33450 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  p..*/ .static vo
33460 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
33470 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
33480 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
33490 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30  ger->nMmapOut==0
334a0 20 26 26 20 28 73 71 6c 69 74 65 33 50 63 61 63   && (sqlite3Pcac
334b0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
334c0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20  r->pPCache)==0) 
334d0 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
334e0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
334f0 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
33500 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
33510 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
33520 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70  number pgno in p
33530 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70  ager pPager (a p
33540 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  age.** reference
33550 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65   has type DbPage
33560 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  *). If the reque
33570 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69  sted reference i
33580 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  s .** successful
33590 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20  ly obtained, it 
335a0 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70  is copied to *pp
335b0 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  Page and SQLITE_
335c0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
335d0 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
335e0 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65  ted page is alre
335f0 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
33600 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
33610 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
33620 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
33630 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
33640 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
33650 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20  th data.** read 
33660 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
33670 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20  e file. In some 
33680 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68  cases, the pcach
33690 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20  e module may.** 
336a0 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c  choose not to al
336b0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
336c0 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79  e object and may
336d0 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   reuse an existi
336e0 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74  ng.** object wit
336f0 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  h no outstanding
33700 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
33710 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74  ** The extra dat
33720 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
33730 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
33740 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
33750 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73  ros the .** firs
33760 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
33770 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
33780 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65  ory. If the page
33790 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a   requested is .*
337a0 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
337b0 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73   cache when this
337c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
337d0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78  led, then the ex
337e0 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c  tra.** data is l
337f0 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68  eft as it was wh
33800 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  en the page obje
33810 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  ct was last used
33820 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
33830 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73  atabase image is
33840 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
33850 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
33860 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e   or if a .** non
33870 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70  -zero value is p
33880 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43  assed as the noC
33890 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72  ontent parameter
338a0 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
338b0 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
338c0 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
338d0 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
338e0 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
338f0 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
33900 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
33910 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
33920 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
33930 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
33940 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
33950 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
33960 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
33970 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
33980 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
33990 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
339a0 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
339b0 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
339c0 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a  scenarios:.**.**
339d0 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69     a) When readi
339e0 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ng a free-list l
339f0 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68  eaf page from th
33a00 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a  e database, and.
33a10 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20  **.**   b) When 
33a20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62  a savepoint is b
33a30 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
33a40 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
33a50 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e  load.**      a n
33a60 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
33a70 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c   cache to be fil
33a80 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
33a90 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  a read.**      f
33aa0 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e  rom the savepoin
33ab0 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
33ac0 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
33ad0 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
33ae0 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73  data returned is
33af0 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20   zeroed instead 
33b00 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64  of.** being read
33b10 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
33b20 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  se. Additionally
33b30 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65  , the bits corre
33b40 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
33b50 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  gno in Pager.pIn
33b60 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20  Journal (bitvec 
33b70 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
33b80 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
33b90 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ** journal file)
33ba0 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
33bb0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
33bc0 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20  oint bitvecs of 
33bd0 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65  any open.** save
33be0 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20  points are set. 
33bf0 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68  This means if th
33c00 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77  e page is made w
33c10 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a  ritable at any.*
33c20 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  * point in the f
33c30 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63  uture, using a c
33c40 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
33c50 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20  gerWrite(), its 
33c60 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c  contents.** will
33c70 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65   not be journale
33c80 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f  d. This saves IO
33c90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
33ca0 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
33cb0 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
33cc0 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
33cd0 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
33ce0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
33cf0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
33d00 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
33d10 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
33d20 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
33d30 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
33d40 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
33d50 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29  ine and Lookup()
33d60 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
33d70 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
33d80 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
33d90 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
33da0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
33db0 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
33dc0 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
33dd0 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
33de0 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
33df0 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  as Lookup().** j
33e00 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
33e10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
33e20 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
33e30 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
33e40 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
33e50 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
33e60 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
33e70 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
33e80 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
33e90 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29  * Since Lookup()
33ea0 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
33eb0 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
33ec0 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
33ed0 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
33ee0 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  al files..*/.int
33ef0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
33f00 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
33f10 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
33f20 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
33f30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
33f40 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
33f50 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
33f60 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
33f70 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
33f80 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
33f90 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
33fa0 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
33fb0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
33fc0 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
33fd0 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  ET_XXX flags */.
33fe0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
33ff0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72  LITE_OK;.  PgHdr
34000 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32   *pPg = 0;.  u32
34010 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20   iFrame = 0;    
34020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34030 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72  Frame to read fr
34040 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20  om WAL file */. 
34050 20 63 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e   const int noCon
34060 74 65 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20  tent = (flags & 
34070 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
34080 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  ENT);..  /* It i
34090 73 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20  s acceptable to 
340a0 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  use a read-only 
340b0 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20  (mmap) page for 
340c0 61 6e 79 20 70 61 67 65 20 65 78 63 65 70 74 0a  any page except.
340d0 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74    ** page 1 if t
340e0 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65  here is no write
340f0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
34100 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49 52 45  n or the ACQUIRE
34110 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66  _READONLY.  ** f
34120 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65  lag was specifie
34130 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
34140 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20   And so long as 
34150 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20  the db is not a 
34160 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
34170 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
34180 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e  abase.  */.  con
34190 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d  st int bMmapOk =
341a0 20 28 70 67 6e 6f 3e 31 20 26 26 20 55 53 45 46   (pgno>1 && USEF
341b0 45 54 43 48 28 70 50 61 67 65 72 29 0a 20 20 20  ETCH(pPager).   
341c0 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
341d0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
341e0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47   || (flags & PAG
341f0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29  ER_GET_READONLY)
34200 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ).#ifdef SQLITE_
34210 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26 20  HAS_CODEC.   && 
34220 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d  pPager->xCodec==
34230 30 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20  0.#endif.  );.. 
34240 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   /* Optimization
34250 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20 74   note:  Adding t
34260 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72  he "pgno<=1" ter
34270 6d 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d  m before "pgno==
34280 30 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c  0" here.  ** all
34290 6f 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ows the compiler
342a0 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72 65   optimizer to re
342b0 75 73 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  use the results 
342c0 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a  of the "pgno>1".
342d0 20 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68 65    ** test in the
342e0 20 70 72 65 76 69 6f 75 73 20 73 74 61 74 65 6d   previous statem
342f0 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20 74  ent, and avoid t
34300 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69  esting pgno==0 i
34310 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f  n the.  ** commo
34320 6e 20 63 61 73 65 20 77 68 65 72 65 20 70 67 6e  n case where pgn
34330 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20  o is large. */. 
34340 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20   if( pgno<=1 && 
34350 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pgno==0 ){.    r
34360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
34370 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
34380 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34390 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
343a0 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
343b0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
343c0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
343d0 0a 20 20 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e  .  assert( noCon
343e0 74 65 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70  tent==0 || bMmap
343f0 4f 6b 3d 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65  Ok==0 );..  asse
34400 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73 48  rt( pPager->hasH
34410 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31  eldSharedLock==1
34420 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
34430 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
34440 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65   error state, re
34450 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d  turn an error im
34460 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a  mediately. .  **
34470 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75   Otherwise, requ
34480 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f  est the page fro
34490 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79  m the PCache lay
344a0 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  er. */.  if( pPa
344b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
344c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
344d0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
344e0 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
344f0 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26    if( bMmapOk &&
34500 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
34510 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
34520 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
34530 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
34540 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61  Wal, pgno, &iFra
34550 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  me);.      if( r
34560 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
34570 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34580 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
34590 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26    if( bMmapOk &&
345a0 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   iFrame==0 ){.  
345b0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
345c0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  = 0;..      rc =
345d0 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28   sqlite3OsFetch(
345e0 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20  pPager->fd, .   
345f0 20 20 20 20 20 20 20 28 69 36 34 29 28 70 67 6e         (i64)(pgn
34600 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
34610 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d  ageSize, pPager-
34620 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74  >pageSize, &pDat
34630 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20  a.      );..    
34640 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34650 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a  _OK && pData ){.
34660 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
34670 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
34680 5f 52 45 41 44 45 52 20 7c 7c 20 70 50 61 67 65  _READER || pPage
34690 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
346a0 20 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 73           pPg = s
346b0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
346c0 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
346d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
346e0 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
346f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
34700 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
34710 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  age(pPager, pgno
34720 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a  , pData, &pPg);.
34730 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
34740 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
34750 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
34760 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
34770 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
34780 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
34790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
347a0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
347b0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
347c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
347d0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
347e0 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 20  = pPg;.         
347f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34800 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
34810 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
34820 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34830 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
34840 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
34860 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74     {.      sqlit
34870 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
34880 70 42 61 73 65 3b 0a 20 20 20 20 20 20 70 42 61  pBase;.      pBa
34890 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  se = sqlite3Pcac
348a0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
348b0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33  pPCache, pgno, 3
348c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 61  );.      if( pBa
348d0 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  se==0 ){.       
348e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
348f0 63 68 65 46 65 74 63 68 53 74 72 65 73 73 28 70  cheFetchStress(p
34900 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
34910 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20  pgno, &pBase);. 
34920 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
34930 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
34940 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34950 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  r;.        if( p
34960 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Base==0 ){.     
34970 20 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61       pPg = *ppPa
34980 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
34990 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
349a0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
349b0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
349c0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
349d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
349e0 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67      pPg = *ppPag
349f0 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
34a00 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50 61  eFetchFinish(pPa
34a10 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
34a20 6e 6f 2c 20 70 42 61 73 65 29 3b 0a 20 20 20 20  no, pBase);.    
34a30 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30    assert( pPg!=0
34a40 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
34a50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34a60 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  OK ){.    /* Eit
34a70 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  her the call to 
34a80 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
34a90 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e  ch() returned an
34aa0 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20   error or the.  
34ab0 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61    ** pager was a
34ac0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
34ad0 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
34ae0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
34af0 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20   called..    ** 
34b00 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64  Set pPg to 0 and
34b10 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63   jump to the exc
34b20 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20  eption handler. 
34b30 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   */.    pPg = 0;
34b40 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f  .    goto pager_
34b50 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d  acquire_err;.  }
34b60 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 3d 3d  .  assert( pPg==
34b70 28 2a 70 70 50 61 67 65 29 20 29 3b 0a 20 20 61  (*ppPage) );.  a
34b80 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
34b90 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ==pgno );.  asse
34ba0 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
34bb0 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e  =pPager || pPg->
34bc0 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20  pPager==0 );..  
34bd0 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65 72 20  if( pPg->pPager 
34be0 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  && !noContent ){
34bf0 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
34c00 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20  case the pcache 
34c10 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
34c20 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   an initialized 
34c30 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74  copy of.    ** t
34c40 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20  he page. Return 
34c50 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20  without further 
34c60 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ado.  */.    ass
34c70 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52  ert( pgno<=PAGER
34c80 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e  _MAX_PGNO && pgn
34c90 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
34ca0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
34cb0 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
34cc0 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b  GER_STAT_HIT]++;
34cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
34ce0 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b  TE_OK;..  }else{
34cf0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
34d00 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61  r cache has crea
34d10 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ted a new page. 
34d20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64  Its content need
34d30 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20  s to .    ** be 
34d40 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f  initialized.  */
34d50 0a 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ..    pPg->pPage
34d60 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
34d70 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
34d80 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
34d90 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
34da0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
34db0 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  page.    ** numb
34dc0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
34dd0 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75  this, or the unu
34de0 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65  sed locking-page
34df0 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20  , is requested. 
34e00 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
34e10 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
34e20 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
34e30 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
34e40 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
34e50 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34e60 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
34e70 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34e80 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
34e90 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
34ea0 2d 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20  ->fd) || !MEMDB 
34eb0 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70  );.    if( !isOp
34ec0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
34ed0 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
34ee0 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65  <pgno || noConte
34ef0 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nt ){.      if( 
34f00 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
34f10 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  gno ){.        r
34f20 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
34f30 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
34f40 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
34f60 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  f( noContent ){.
34f70 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75          /* Failu
34f80 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69  re to set the bi
34f90 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72  ts in the InJour
34fa0 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20  nal bit-vectors 
34fb0 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20  is benign..     
34fc0 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20     ** It merely 
34fd0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69  means that we mi
34fe0 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72  ght do some extr
34ff0 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61  a work to journa
35000 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  l a .        ** 
35010 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
35020 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f  ot need to be jo
35030 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74  urnaled.  Nevert
35040 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20  heless, be sure 
35050 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  .        ** to t
35060 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65  est the case whe
35070 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  re a malloc erro
35080 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
35090 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20  rying to set .  
350a0 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69        ** a bit i
350b0 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a  n a bit vector..
350c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
350d0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
350e0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
350f0 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c         if( pgno<
35100 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
35110 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
35120 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
35130 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  ) sqlite3BitvecS
35140 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
35150 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20  urnal, pgno);.  
35160 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
35170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
35180 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EM );.        }.
35190 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
351a0 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61  ( rc = ) addToSa
351b0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
351c0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
351d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
351e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
351f0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
35200 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
35210 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oc();.      }.  
35220 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
35230 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
35240 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
35250 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52     IOTRACE(("ZER
35260 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  O %p %d\n", pPag
35270 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
35280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
35290 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
352a0 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d  ger) && bMmapOk=
352b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
352c0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
352d0 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
352e0 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61  Wal, pgno, &iFra
352f0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
35300 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
35310 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
35320 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
35330 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
35340 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
35350 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  er );.      pPag
35360 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
35370 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20  STAT_MISS]++;.  
35380 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
35390 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29  age(pPg, iFrame)
353a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
353b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
353c0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
353d0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
353e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
353f0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
35400 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  h(pPg);.  }..  r
35410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35420 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  ..pager_acquire_
35430 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72  err:.  assert( r
35440 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
35450 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
35460 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
35470 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  op(pPg);.  }.  p
35480 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
35490 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a  ed(pPager);..  *
354a0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
354b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
354c0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
354d0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
354e0 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
354f0 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
35500 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
35510 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
35520 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
35530 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
35540 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
35550 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
35560 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  . .**.** See als
35570 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
35580 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
35590 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
355a0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
355b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
355c0 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
355d0 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
355e0 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
355f0 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
35600 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
35610 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
35620 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
35630 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
35640 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
35650 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
35660 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
35670 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
35680 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
35690 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
356a0 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
356b0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
356c0 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63  o){.  sqlite3_pc
356d0 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65  ache_page *pPage
356e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
356f0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
35700 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
35710 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35720 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20  pPCache!=0 );.  
35730 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  pPage = sqlite3P
35740 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
35750 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
35760 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
35770 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pPage==0 || pPag
35780 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
35790 64 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 70  dLock );.  if( p
357a0 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
357b0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   0;.  return sql
357c0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46  ite3PcacheFetchF
357d0 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50  inish(pPager->pP
357e0 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61  Cache, pgno, pPa
357f0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
35800 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66  lease a page ref
35810 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erence..**.** If
35820 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
35830 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
35840 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
35850 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
35860 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
35870 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
35880 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
35890 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
358a0 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
358b0 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
358c0 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
358d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
358e0 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
358f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
35900 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
35910 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
35920 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
35930 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30    assert( pPg!=0
35940 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70   );.  pPager = p
35950 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
35960 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  ( pPg->flags & P
35970 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20  GHDR_MMAP ){.   
35980 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
35990 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c  Page(pPg);.  }el
359a0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  se{.    sqlite3P
359b0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
359c0 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
359d0 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
359e0 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ger);.}.void sql
359f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
35a00 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
35a10 66 28 20 70 50 67 20 29 20 73 71 6c 69 74 65 33  f( pPg ) sqlite3
35a20 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
35a30 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l(pPg);.}../*.**
35a40 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
35a50 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
35a60 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77  start of every w
35a70 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
35a80 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  ..** There must 
35a90 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
35aa0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
35ab0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
35ac0 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
35ad0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
35ae0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
35af0 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75  .** Open the jou
35b00 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
35b10 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77  ger pPager and w
35b20 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68  rite a journal h
35b30 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  eader.** to the 
35b40 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20  start of it. If 
35b50 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
35b60 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65   savepoints, ope
35b70 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
35b80 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68  l.** as well. Th
35b90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
35ba0 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68  nly used when th
35bb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
35bc0 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e  s being .** open
35bd0 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f  ed to write a ro
35be0 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61  llback log for a
35bf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
35c00 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a   is not used .**
35c10 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   when opening a 
35c20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot journal file
35c30 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
35c40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
35c50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
35c60 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20  lready open (as 
35c70 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63  it may be in exc
35c80 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a  lusive mode),.**
35c90 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
35ca0 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20  ion just writes 
35cb0 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
35cc0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
35cd0 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20   the.** already 
35ce0 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  open file. .**.*
35cf0 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
35d00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35d10 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74  e is opened by t
35d20 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
35d30 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f  e.** Pager.pInJo
35d40 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72  urnal bitvec str
35d50 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
35d60 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ted..**.** Retur
35d70 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
35d80 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
35d90 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69  cessful. Otherwi
35da0 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  se, return .** S
35db0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74  QLITE_NOMEM if t
35dc0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  he attempt to al
35dd0 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e  locate Pager.pIn
35de0 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  Journal fails, o
35df0 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f  r .** an IO erro
35e00 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e  r code if openin
35e10 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
35e20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
35e30 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
35e40 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
35e50 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
35e60 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
35e70 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
35e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
35ea0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
35eb0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
35ec0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20  = pPager->pVfs; 
35ed0 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
35ee0 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20   of vfs pointer 
35ef0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
35f00 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35f10 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
35f20 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
35f30 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
35f40 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
35f50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
35f60 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
35f70 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61    .  /* If alrea
35f80 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
35f90 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
35fa0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
35fb0 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68    But on.  ** th
35fc0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
35fd0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
35fe0 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65  ver called if we
35ff0 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a   are already in.
36000 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74    ** an error st
36010 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ate. */.  if( NE
36020 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
36030 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50  ode) ) return pP
36040 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
36050 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
36060 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
36070 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
36080 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
36090 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
360a0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
360b0 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
360c0 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
360d0 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  >dbSize);.    if
360e0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
360f0 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rnal==0 ){.     
36100 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
36110 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
36120 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  .  .    /* Open 
36130 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36140 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
36150 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20  ready open. */. 
36160 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
36170 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
36180 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
36190 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
361a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
361b0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
361c0 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
361d0 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
361e0 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  jfd);.      }els
361f0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  e{.        int f
36200 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
36210 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
36220 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
36230 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70  .        int nSp
36240 69 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  ill;..        if
36250 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
36260 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
36270 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  flags |= (SQLITE
36280 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
36290 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
362a0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  TEMP_JOURNAL);. 
362b0 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20           nSpill 
362c0 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  = sqlite3Config.
362d0 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20  nStmtSpill;.    
362e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
362f0 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
36300 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
36310 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
36320 20 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c 42    nSpill = jrnlB
36330 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
36340 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
36350 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
36360 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
36370 68 65 20 64 61 74 61 62 61 73 65 20 73 74 69 6c  he database stil
36380 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  l has the same n
36390 61 6d 65 20 61 73 20 69 74 20 64 69 64 20 77 68  ame as it did wh
363a0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  en.        ** it
363b0 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20   was originally 
363c0 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20  opened. */.     
363d0 20 20 20 72 63 20 3d 20 64 61 74 61 62 61 73 65     rc = database
363e0 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72  IsUnmoved(pPager
363f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
36400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36410 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
36420 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
36430 6e 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  n (.            
36440 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
36450 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
36460 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53  ->jfd, flags, nS
36470 70 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 29  pill.          )
36480 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36490 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
364a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
364b0 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
364c0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a  ->jfd) );.    }.
364d0 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69    .  .    /* Wri
364e0 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
364f0 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
36500 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
36510 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a  and open .    **
36520 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
36530 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
36540 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
36550 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36560 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68       /* TODO: Ch
36570 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  eck if all of th
36580 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72  ese are really r
36590 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
365a0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
365b0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
365c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
365d0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
365e0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
365f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
36600 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20  rnalHdr = 0;.   
36610 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
36620 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
36630 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
36640 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36650 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
36660 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
36670 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
36680 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
36690 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
366a0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
366b0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
366c0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
366d0 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61  OCKED );.    pPa
366e0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
366f0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
36700 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  MOD;.  }..  retu
36710 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
36720 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72  Begin a write-tr
36730 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
36740 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72   specified pager
36750 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a   object. If a .*
36760 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
36770 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
36780 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69  been opened, thi
36790 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
367a0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
367b0 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d  the exFlag argum
367c0 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ent is false, th
367d0 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
367e0 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a  ast a RESERVED.*
367f0 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
36800 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
36810 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
36820 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
36830 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c  least.** an EXCL
36840 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73  USIVE lock. If s
36850 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c  uch a lock is al
36860 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c  ready held, no l
36870 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74  ocking .** funct
36880 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c  ions need be cal
36890 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  led..**.** If th
368a0 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
368b0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a  rgument is non-z
368c0 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75  ero, then any su
368d0 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64  b-journal opened
368e0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
368f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
36900 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e   be opened as an
36910 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e   in-memory file.
36920 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20   This.** has no 
36930 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75  effect if the su
36940 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72  b-journal is alr
36950 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20  eady opened (as 
36960 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a  it may be when.*
36970 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  * running in exc
36980 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20  lusive mode) or 
36990 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
369a0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  on does not requ
369b0 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75  ire a.** sub-jou
369c0 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62  rnal. If the sub
369d0 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
369e0 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  nt is zero, then
369f0 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a   any required.**
36a00 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
36a10 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d  implemented in-m
36a20 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20  emory if pPager 
36a30 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
36a40 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72  database, .** or
36a50 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61   using a tempora
36a60 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73  ry file otherwis
36a70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
36a80 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65  3PagerBegin(Page
36a90 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
36aa0 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49  xFlag, int subjI
36ab0 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20  nMemory){.  int 
36ac0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
36ad0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
36ae0 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20  rrCode ) return 
36af0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
36b00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36b10 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
36b20 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65  _READER && pPage
36b30 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
36b40 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65  ERROR );.  pPage
36b50 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
36b60 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f  = (u8)subjInMemo
36b70 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59  ry;..  if( ALWAY
36b80 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  S(pPager->eState
36b90 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20  ==PAGER_READER) 
36ba0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
36bb0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36bc0 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28  l==0 );..    if(
36bd0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
36be0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ger) ){.      /*
36bf0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
36c00 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
36c10 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  se locking_mode=
36c20 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61  exclusive, and a
36c30 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75  n.      ** exclu
36c40 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
36c50 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
36c60 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
36c70 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20  btain it now..  
36c80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
36c90 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
36ca0 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65  veMode && sqlite
36cb0 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
36cc0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
36cd0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  -1) ){.        r
36ce0 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
36cf0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
36d00 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
36d10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36d20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
36d30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
36d40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 28 76 6f     }.        (vo
36d50 69 64 29 73 71 6c 69 74 65 33 57 61 6c 45 78 63  id)sqlite3WalExc
36d60 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
36d70 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20  r->pWal, 1);.   
36d80 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
36d90 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f  rab the write lo
36da0 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69  ck on the log fi
36db0 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
36dc0 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20  l, upgrade to.  
36dd0 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53      ** PAGER_RES
36de0 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68  ERVED state. Oth
36df0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
36e00 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
36e10 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
36e20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61    ** The busy-ha
36e30 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76  ndler is not inv
36e40 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20  oked if another 
36e50 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61  connection alrea
36e60 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64  dy.      ** hold
36e70 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  s the write-lock
36e80 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  . If possible, t
36e90 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
36ea0 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20  ill call it..   
36eb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
36ec0 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e   sqlite3WalBegin
36ed0 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  WriteTransaction
36ee0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
36ef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36f00 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53   /* Obtain a RES
36f10 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
36f20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
36f30 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70   If the exFlag p
36f40 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a  arameter.      *
36f50 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  * is true, then 
36f60 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72  immediately upgr
36f70 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45  ade this to an E
36f80 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
36f90 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79  he.      ** busy
36fa0 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
36fb0 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
36fc0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
36fd0 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
36fe0 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74      ** lock, but
36ff0 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e   not when obtain
37000 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44  ing the RESERVED
37010 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   lock..      */.
37020 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
37030 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
37040 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
37050 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
37060 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67  ITE_OK && exFlag
37070 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
37080 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
37090 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
370a0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
370b0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
370c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
370d0 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68  K ){.      /* Ch
370e0 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c  ange to WRITER_L
370f0 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20  OCKED state..   
37100 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
37110 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67  AL mode sets Pag
37120 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47  er.eState to PAG
37130 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
37140 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20   or CACHEMOD.   
37150 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61     ** when it ha
37160 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61  s an open transa
37170 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72  ction, but never
37180 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e   to DBMOD or FIN
37190 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20  ISHED..      ** 
371a0 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
371b0 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73 20  in those states 
371c0 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c  the code to roll
371d0 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20   back savepoint 
371e0 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
371f0 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20  ctions may copy 
37200 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75  data from the su
37210 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  b-journal into t
37220 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
37230 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 77 65     ** file as we
37240 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70  ll as into the p
37250 61 67 65 20 63 61 63 68 65 2e 20 57 68 69 63 68  age cache. Which
37260 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72   would be incorr
37270 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  ect in .      **
37280 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20   WAL mode..     
37290 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
372a0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
372b0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a  _WRITER_LOCKED;.
372c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
372d0 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65  HintSize = pPage
372e0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
372f0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
37300 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
37310 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
37320 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
37330 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
37340 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
37350 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
37360 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
37370 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37380 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
37390 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
373a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
373b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
373c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
373d0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
373e0 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  KED );.    asser
373f0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
37400 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
37410 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
37420 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE(("TRANSACTION
37430 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
37440 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74  pPager)));.  ret
37450 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
37460 20 57 72 69 74 65 20 70 61 67 65 20 70 50 67 20   Write page pPg 
37470 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
37480 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
37490 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
374a0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
374b0 69 6e 74 20 70 61 67 65 72 41 64 64 50 61 67 65  int pagerAddPage
374c0 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61  ToRollbackJourna
374d0 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  l(PgHdr *pPg){. 
374e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
374f0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
37500 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 63 6b  int rc;.  u32 ck
37510 73 75 6d 3b 0a 20 20 63 68 61 72 20 2a 70 44 61  sum;.  char *pDa
37520 74 61 32 3b 0a 20 20 69 36 34 20 69 4f 66 66 20  ta2;.  i64 iOff 
37530 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
37540 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 65 20 73  lOff;..  /* We s
37550 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
37560 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
37570 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
37580 68 61 74 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  hat.  ** contain
37590 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  s the database l
375a0 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ocks.  The follo
375b0 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69  wing assert veri
375c0 66 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 77  fies.  ** that w
375d0 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 61  e do not. */.  a
375e0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
375f0 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
37600 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73  pPager) );..  as
37610 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
37620 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65 72  urnalHdr<=pPager
37630 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
37640 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
37650 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67   pPg->pData, pPg
37660 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
37670 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
37680 4b 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  KPT, pData2);.  
37690 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
376a0 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
376b0 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 2f 2a 20  )pData2);..  /* 
376c0 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
376d0 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
376e0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75  occurs while jou
376f0 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 2a  rnalling the.  *
37700 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
37710 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
37720 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
37730 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
37740 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
37750 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
37760 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
37770 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69  ack, the logic i
37780 6e 0a 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f  n.  ** playback_
37790 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20  one_page() will 
377a0 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70  think that the p
377b0 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
377c0 72 65 73 74 6f 72 65 64 0a 20 20 2a 2a 20 69 6e  restored.  ** in
377d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
377e0 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
377f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
37800 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
37810 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
37820 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
37830 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73   */.  pPg->flags
37840 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
37850 59 4e 43 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  YNC;..  rc = wri
37860 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
37870 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d  >jfd, iOff, pPg-
37880 3e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  >pgno);.  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 20 20 72 63 20 3d 20  turn rc;.  rc = 
378b0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
378c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
378d0 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
378e0 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20  Size, iOff+4);. 
378f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37900 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37910 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
37920 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
37930 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67  iOff+pPager->pag
37940 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b  eSize+4, cksum);
37950 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
37960 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
37970 3b 0a 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a  ;..  IOTRACE(("J
37980 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
37990 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
379a0 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
379b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
379c0 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
379d0 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 50  >pageSize));.  P
379e0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
379f0 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
37a00 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 54 52  ount);.  PAGERTR
37a10 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE(("JOURNAL %d
37a20 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
37a30 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
37a40 6e 22 2c 0a 20 20 20 20 20 20 20 50 41 47 45 52  n",.       PAGER
37a50 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
37a60 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 28  >pgno, .       (
37a70 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
37a80 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
37a90 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
37aa0 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 70 50 61  h(pPg)));..  pPa
37ab0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
37ac0 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70  += 8 + pPager->p
37ad0 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  ageSize;.  pPage
37ae0 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 61 73 73  r->nRec++;.  ass
37af0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
37b00 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
37b10 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
37b20 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
37b30 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
37b40 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65  gno);.  testcase
37b50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
37b60 45 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EM );.  assert( 
37b70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
37b80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
37b90 4d 20 29 3b 0a 20 20 72 63 20 7c 3d 20 61 64 64  M );.  rc |= add
37ba0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
37bb0 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
37bc0 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
37bd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
37be0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
37bf0 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  EM );.  return r
37c00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
37c10 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70   a single data p
37c20 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
37c30 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72  . The page is wr
37c40 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a  itten into the .
37c50 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ** main journal 
37c60 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61  or sub-journal a
37c70 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74  s required. If t
37c80 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
37c90 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f  en into.** one o
37ca0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20  f the journals, 
37cb0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
37cc0 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
37cd0 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49  the .** Pager.pI
37ce0 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
37cf0 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
37d00 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
37d10 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f  int bitvecs.** o
37d20 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70  f any open savep
37d30 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72  oints as appropr
37d40 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
37d50 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28  int pager_write(
37d60 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
37d70 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
37d80 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
37d90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37da0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
37db0 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c  tine is not call
37dc0 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74  ed unless a writ
37dd0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
37de0 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20  s already .  ** 
37df0 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68  been started. Th
37e00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
37e10 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
37e20 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f   open at this po
37e30 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  int..  ** It is 
37e40 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
37e50 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
37e60 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
37e70 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37e80 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
37e90 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  KED.       || pP
37ea0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37eb0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
37ec0 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
37ed0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37ee0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
37ef0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
37f00 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
37f10 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
37f20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37f30 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  errCode==0 );.  
37f40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37f50 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
37f60 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
37f70 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
37f80 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
37f90 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69 67  o be opened. Hig
37fa0 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her level routin
37fb0 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  es have already.
37fc0 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68    ** obtained th
37fd0 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b  e necessary lock
37fe0 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77  s to begin the w
37ff0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
38000 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20 72  , but the.  ** r
38010 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
38020 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65  might not yet be
38030 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e   open. Open it n
38040 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ow if this is th
38050 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  e case..  **.  *
38060 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  * This is done b
38070 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 71  efore calling sq
38080 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
38090 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70 61  irty() on the pa
380a0 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ge. .  ** Otherw
380b0 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65 20  ise, if it were 
380c0 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c 69  done after calli
380d0 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
380e0 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68 65  MakeDirty(), the
380f0 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
38100 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64 20  might occur and 
38110 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64 20  the pager would 
38120 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45 52  end up in WRITER
38130 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20 20  _LOCKED state.  
38140 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d 61  ** with pages ma
38150 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 69 6e  rked as dirty in
38160 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f   the cache..  */
38170 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
38180 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
38190 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  TER_LOCKED ){.  
381a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
381b0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
381c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
381d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
381e0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
381f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
38200 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
38210 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61  _CACHEMOD );.  a
38220 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
38230 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
38240 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  ) );..  /* Mark 
38250 74 68 65 20 70 61 67 65 20 74 68 61 74 20 69 73  the page that is
38260 20 61 62 6f 75 74 20 74 6f 20 62 65 20 6d 6f 64   about to be mod
38270 69 66 69 65 64 20 61 73 20 64 69 72 74 79 2e 20  ified as dirty. 
38280 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
38290 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
382a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 72 6f 6c  ;..  /* If a rol
382b0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 69 73  lback journal is
382c0 20 69 6e 20 75 73 65 2c 20 74 68 65 6d 20 6d 61   in use, them ma
382d0 6b 65 20 73 75 72 65 20 74 68 65 20 70 61 67 65  ke sure the page
382e0 20 74 68 61 74 20 69 73 20 61 62 6f 75 74 0a 20   that is about. 
382f0 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 69 73   ** to change is
38300 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
38310 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20   journal, or if 
38320 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6e 65  the page is a ne
38330 77 20 70 61 67 65 20 6f 66 66 0a 20 20 2a 2a 20  w page off.  ** 
38340 74 68 65 6e 20 65 6e 64 20 6f 66 20 74 68 65 20  then end of the 
38350 66 69 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  file, make sure 
38360 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  it is marked as 
38370 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 2e  PGHDR_NEED_SYNC.
38380 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
38390 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
383a0 6e 61 6c 21 3d 30 29 20 3d 3d 20 69 73 4f 70 65  nal!=0) == isOpe
383b0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
383c0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
383d0 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 0a 20 20  pInJournal!=0.  
383e0 20 26 26 20 73 71 6c 69 74 65 33 42 69 74 76 65   && sqlite3Bitve
383f0 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 50 61  cTestNotNull(pPa
38400 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
38410 20 70 50 67 2d 3e 70 67 6e 6f 29 3d 3d 30 0a 20   pPg->pgno)==0. 
38420 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
38430 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
38440 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  er)==0 );.    if
38450 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  ( pPg->pgno<=pPa
38460 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
38470 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
38480 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c  gerAddPageToRoll
38490 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 70 50 67 29  backJournal(pPg)
384a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
384b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
384c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
384d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
384e0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  e{.      if( pPa
384f0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
38500 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
38510 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
38520 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
38530 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
38540 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  }.      PAGERTRA
38550 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE(("APPEND %d p
38560 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
38570 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
38580 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
38590 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
385a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28  .             ((
385b0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
385c0 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
385d0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ));.    }.  }.. 
385e0 20 2f 2a 20 54 68 65 20 50 47 48 44 52 5f 44 49   /* The PGHDR_DI
385f0 52 54 59 20 62 69 74 20 69 73 20 73 65 74 20 61  RTY bit is set a
38600 62 6f 76 65 20 77 68 65 6e 20 74 68 65 20 70 61  bove when the pa
38610 67 65 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  ge was added to 
38620 74 68 65 20 64 69 72 74 79 2d 6c 69 73 74 0a 20  the dirty-list. 
38630 20 2a 2a 20 61 6e 64 20 62 65 66 6f 72 65 20 77   ** and before w
38640 72 69 74 69 6e 67 20 74 68 65 20 70 61 67 65 20  riting the page 
38650 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
38660 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 61 69 74  k journal.  Wait
38670 20 75 6e 74 69 6c 20 6e 6f 77 2c 0a 20 20 2a 2a   until now,.  **
38680 20 61 66 74 65 72 20