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

Artifact 817f7f7140c9fa2641f28e6330e924708ddd870d:


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 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e 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 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 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: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 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 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 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 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, 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 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
71b0: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
71c0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
71d0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
71e0: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
71f0: 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20    u8 syncFlags; 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7210: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
7220: 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77  SYNC_FULL otherw
7230: 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ise */.  u8 temp
7240: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
7250: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
7260: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
7270: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
7280: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
7290: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
72a0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
72b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
72c0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
72d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72e0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
72f0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38  file I/O */.  u8
7300: 20 68 61 73 53 65 65 6e 53 74 72 65 73 73 3b 20   hasSeenStress; 
7310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67            /* pag
7320: 65 72 53 74 72 65 73 73 28 29 20 63 61 6c 6c 65  erStress() calle
7330: 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 69  d one or more ti
7340: 6d 65 73 20 2a 2f 0a 20 20 75 38 20 69 73 53 6f  mes */.  u8 isSo
7350: 72 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  rter;           
7360: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
7370: 20 61 20 50 41 47 45 52 5f 53 4f 52 54 45 52 20   a PAGER_SORTER 
7380: 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  */..  /*********
7390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
73a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
73b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
73c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
73d0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  *.  ** The follo
73e0: 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61  wing block conta
73f0: 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20  ins those class 
7400: 6d 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61  members that cha
7410: 6e 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  nge during.  ** 
7420: 72 6f 75 74 69 6e 65 20 6f 70 65 72 74 69 6f 6e  routine opertion
7430: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
7440: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
7450: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
7460: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
7470: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
7480: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
7490: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
74a0: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
74b0: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
74c0: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
74d0: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
74e0: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
74f0: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7500: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7510: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7520: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
7530: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
7540: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
7550: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
7560: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
7570: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
7580: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
7590: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
75a0: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
75b0: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75d0: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
75e0: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
75f0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7600: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7620: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
7630: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
7640: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
7650: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
7660: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
7670: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
7680: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
7690: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
76a0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
76b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
76c0: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
76d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
76e0: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
76f0: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7700: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7710: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7720: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
7730: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 53  .  u8 doNotSyncS
7740: 70 69 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 2f  pill;          /
7750: 2a 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 73 70  * Do not do a sp
7760: 69 6c 6c 20 74 68 61 74 20 72 65 71 75 69 72 65  ill that require
7770: 73 20 6a 72 6e 6c 20 73 79 6e 63 20 2a 2f 0a 20  s jrnl sync */. 
7780: 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79   u8 subjInMemory
7790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77a0: 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d  True to use in-m
77b0: 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61  emory sub-journa
77c0: 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 53  ls */.  Pgno dbS
77d0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
77e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
77f0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
7800: 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f  tabase */.  Pgno
7810: 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20 20   dbOrigSize;    
7820: 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a          /* dbSiz
7830: 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  e before the cur
7840: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
7850: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69 6c   */.  Pgno dbFil
7860: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
7870: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
7880: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
7890: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
78a0: 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b 20  gno dbHintSize; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
78c0: 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46 43  lue passed to FC
78d0: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63 61  NTL_SIZE_HINT ca
78e0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  ll */.  int errC
78f0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7900: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
7910: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
7920: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rrors */.  int n
7930: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
7940: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
7950: 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65  journalled since
7960: 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77   last j-header w
7970: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20  ritten */.  u32 
7980: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
7990: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
79a0: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
79b0: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
79c0: 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e  cksum */.  u32 n
79d0: 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20  SubRec;         
79e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
79f0: 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74   of records writ
7a00: 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e  ten to sub-journ
7a10: 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  al */.  Bitvec *
7a20: 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  pInJournal;     
7a30: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
7a40: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
7a50: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7a60: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
7a70: 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20  ile *fd;        
7a80: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7a90: 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61  iptor for databa
7aa0: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
7ab0: 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
7ac0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7ad0: 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20  riptor for main 
7ae0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c  journal */.  sql
7af0: 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b  ite3_file *sjfd;
7b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
7b10: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
7b20: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
7b30: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b   i64 journalOff;
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7b50: 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66  Current write of
7b60: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
7b70: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
7b80: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
7b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
7ba0: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
7bb0: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
7bc0: 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  der */.  sqlite3
7bd0: 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70  _backup *pBackup
7be0: 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
7bf0: 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69  to list of ongoi
7c00: 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ng backup proces
7c10: 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53 61  ses */.  PagerSa
7c20: 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f  vepoint *aSavepo
7c30: 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66  int; /* Array of
7c40: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
7c50: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76  ts */.  int nSav
7c60: 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20  epoint;         
7c70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7c80: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61   elements in aSa
7c90: 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63  vepoint[] */.  c
7ca0: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
7cb0: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
7cc0: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
7cd0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
7ce0: 6e 67 65 73 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a  nges */.  /*.  *
7cf0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75  * End of the rou
7d00: 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20  tinely-changing 
7d10: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20  class members.  
7d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20  ***********/..  
7d70: 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20  u16 nExtra;     
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7d90: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
7da0: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
7db0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
7dc0: 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  16 nReserve;    
7dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7de0: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
7df0: 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65  ytes at end of e
7e00: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33  ach page */.  u3
7e10: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
7e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
7e30: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
7e40: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
7e50: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7e70: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
7e80: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
7e90: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  ck */.  int page
7ea0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
7eb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7ec0: 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65   bytes in a page
7ed0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e   */.  Pgno mxPgn
7ee0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
7ef0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
7f00: 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  owed size of the
7f10: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
7f20: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
7f30: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
7f40: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
7f50: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
7f60: 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  files */.  char 
7f70: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
7f80: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
7f90: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
7fa0: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
7fb0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
7fc0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
7fd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7fe0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
7ff0: 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29  yHandler)(void*)
8000: 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ; /* Function to
8010: 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20   call when busy 
8020: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
8030: 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20  HandlerArg;     
8040: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75   /* Context argu
8050: 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61  ment for xBusyHa
8060: 6e 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66 20  ndler */.#ifdef 
8070: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
8080: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20  t nHit, nMiss;  
8090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
80a0: 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73  he hits and miss
80b0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ing */.  int nRe
80c0: 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ad, nWrite;     
80d0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
80e0: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
80f0: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
8100: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
8110: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
8120: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
8130: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
8140: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
8150: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
8160: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
8170: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
8180: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
8190: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
81a0: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
81b0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
81c0: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
81d0: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
81e0: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
81f0: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
8200: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
8210: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
8220: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
8230: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
8240: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8260: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
8270: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
8280: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
8290: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
82a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
82b0: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
82c0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
82d0: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50  r tmp use */.  P
82e0: 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20  Cache *pPCache; 
82f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
8300: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61  inter to page ca
8310: 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69  che object */.#i
8320: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8330: 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61  T_WAL.  Wal *pWa
8340: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8350: 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65      /* Write-ahe
8360: 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22  ad log used by "
8370: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
8380: 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61  " */.  char *zWa
8390: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
83a0: 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
83b0: 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20  for write-ahead 
83c0: 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  log */.#endif.};
83d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
83e0: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
83f0: 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e  iables hold coun
8400: 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  ters used for.**
8410: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
8420: 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76  s only.  These v
8430: 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20  ariables do not 
8440: 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f  exist in.** a no
8450: 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e  n-testing build.
8460: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
8470: 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64  s are not thread
8480: 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  -safe..*/.#ifdef
8490: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
84a0: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72   sqlite3_pager_r
84b0: 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b  eaddb_count = 0;
84c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
84d0: 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64   full pages read
84e0: 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20   from DB */.int 
84f0: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
8500: 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b  itedb_count = 0;
8510: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8520: 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74  full pages writt
8530: 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20  en to DB */.int 
8540: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
8550: 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  itej_count = 0; 
8560: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8570: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8580: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65   journal */.# de
8590: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
85a0: 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20  v)  v++.#else.# 
85b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
85c0: 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  R(v).#endif..../
85d0: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
85e0: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
85f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
8600: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
8610: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
8620: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
8630: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
8640: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
8650: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
8660: 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e  Since version 2.
8670: 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  8.0, the journal
8680: 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73   format contains
8690: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
86a0: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
86b0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
86c0: 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20  the power fails 
86d0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
86e0: 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72  l is being.** wr
86f0: 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64  itten, semi-rand
8700: 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20  om garbage data 
8710: 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
8720: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
8730: 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20  ile after power 
8740: 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66  is restored.  If
8750: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74   an attempt is t
8760: 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72  hen made.** to r
8770: 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  oll the journal 
8780: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
8790: 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72  se could be corr
87a0: 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69  upted.  The addi
87b0: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79  tional.** sanity
87c0: 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69   checking data i
87d0: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
87e0: 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72  discover the gar
87f0: 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  bage in the.** j
8800: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72  ournal and ignor
8810: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e it..**.** The 
8820: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8830: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
8840: 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
8850: 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a  format consists.
8860: 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63  ** of a 32-bit c
8870: 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20  hecksum on each 
8880: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54  page of data.  T
8890: 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65  he checksum cove
88a0: 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70  rs both.** the p
88b0: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  age number and t
88c0: 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  he pPager->pageS
88d0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
88e0: 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  a for the page..
88f0: 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73  ** This cksum is
8900: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
8910: 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20  a 32-bit random 
8920: 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61  value that appea
8930: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  rs in the.** jou
8940: 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20  rnal file right 
8950: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
8960: 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e  .  The random in
8970: 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70  itializer is imp
8980: 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75  ortant,.** becau
8990: 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20  se garbage data 
89a0: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
89b0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
89c0: 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a  rnal is likely.*
89d0: 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  * data that was 
89e0: 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69  once in other fi
89f0: 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  les that have no
8a00: 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20  w been deleted. 
8a10: 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61   If the.** garba
8a20: 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f  ge data came fro
8a30: 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f  m an obsolete jo
8a40: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
8a50: 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a  checksums might.
8a60: 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20  ** be correct.  
8a70: 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  But by initializ
8a80: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
8a90: 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65   to random value
8aa0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66   which.** is dif
8ab0: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
8ac0: 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e   journal, we min
8ad0: 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e  imize that risk.
8ae0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
8af0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
8b00: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d  JournalMagic[] =
8b10: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
8b20: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
8b30: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
8b40: 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  xd7,.};../*.** T
8b50: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  he size of the o
8b60: 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63 6f  f each page reco
8b70: 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  rd in the journa
8b80: 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  l is given by.**
8b90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
8ba0: 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  acro..*/.#define
8bb0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
8bc0: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
8bd0: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
8be0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
8bf0: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
8c00: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
8c10: 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
8c20: 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a  the same .** siz
8c30: 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69  e as a single di
8c40: 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61  sk sector. See a
8c50: 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a  lso setSectorSiz
8c60: 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  e()..*/.#define 
8c70: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8c80: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
8c90: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
8ca0: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
8cb0: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
8cc0: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
8cd0: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
8ce0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
8cf0: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
8d00: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
8d10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
8d20: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
8d30: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
8d40: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
8d50: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
8d60: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
8d70: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
8d80: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
8d90: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
8da0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8db0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
8dc0: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
8dd0: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
8de0: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
8df0: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
8e00: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
8e10: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
8e20: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
8e30: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
8e40: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
8e50: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  3647../*.** The 
8e60: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
8e70: 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65   macro is a file
8e80: 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70   descriptor (typ
8e90: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e sqlite3_file*)
8ea0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
8eb0: 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c   it is not open,
8ec0: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75   or non-zero (bu
8ed0: 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69  t not 1) if it i
8ee0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
8ef0: 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73   so that express
8f00: 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74  ions can be writ
8f10: 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ten as:.**.**   
8f20: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
8f30: 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a  r->jfd) ){ ....*
8f40: 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a  *.** instead of.
8f50: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67  **.**   if( pPag
8f60: 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  er->jfd->pMethod
8f70: 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66  s ){ ....*/.#def
8f80: 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20  ine isOpen(pFd) 
8f90: 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73  ((pFd)->pMethods
8fa0: 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )../*.** Return 
8fb0: 74 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67  true if this pag
8fc0: 65 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d  er uses a write-
8fd0: 61 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61  ahead log instea
8fe0: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
8ff0: 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
9000: 61 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61  al. Otherwise fa
9010: 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  lse..*/.#ifndef 
9020: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
9030: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
9040: 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50  UseWal(Pager *pP
9050: 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
9060: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30  (pPager->pWal!=0
9070: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
9080: 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28  ine pagerUseWal(
9090: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
90a0: 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78  gerRollbackWal(x
90b0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
90c0: 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c  erWalFrames(v,w,
90d0: 78 2c 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e  x,y,z) 0.# defin
90e0: 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  e pagerOpenWalIf
90f0: 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54  Present(z) SQLIT
9100: 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61  E_OK.# define pa
9110: 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
9120: 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54  saction(z) SQLIT
9130: 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  E_OK.#endif..#if
9140: 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a  ndef NDEBUG ./*.
9150: 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20  ** Usage:.**.** 
9160: 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
9170: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
9180: 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  ger) );.**.** Th
9190: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73  is function runs
91a0: 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f   many asserts to
91b0: 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63   try to find inc
91c0: 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a  onsistencies in.
91d0: 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ** the internal 
91e0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67  state of the Pag
91f0: 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  er object..*/.st
9200: 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f  atic int assert_
9210: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
9220: 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a  r *p){.  Pager *
9230: 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f  pPager = p;..  /
9240: 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20  * State must be 
9250: 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65  valid. */.  asse
9260: 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50  rt( p->eState==P
9270: 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20  AGER_OPEN.      
9280: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9290: 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20  AGER_READER.    
92a0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
92b0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
92c0: 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  CKED.       || p
92d0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
92e0: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
92f0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9300: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9310: 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c  R_DBMOD.       |
9320: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9330: 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
9340: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9350: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
9360: 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52  ROR.  );..  /* R
9370: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
9380: 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20   current state, 
9390: 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e  a temp-file conn
93a0: 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65  ection always be
93b0: 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66  haves.  ** as if
93c0: 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75   it has an exclu
93d0: 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
93e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
93f0: 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73  It never updates
9400: 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65  .  ** the change
9410: 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20  -counter field, 
9420: 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  so the changeCou
9430: 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61  ntDone flag is a
9440: 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a  lways set..  */.
9450: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
9460: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65  pFile==0 || p->e
9470: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
9480: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
9490: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
94a0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e   || pPager->chan
94b0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a  geCountDone );..
94c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a    /* If the useJ
94d0: 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63  ournal flag is c
94e0: 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61  lear, the journa
94f0: 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22  l-mode must be "
9500: 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20  OFF". .  ** And 
9510: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  if the journal-m
9520: 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68  ode is "OFF", th
9530: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
9540: 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e  ust not be open.
9550: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
9560: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9570: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9580: 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a  E_OFF || p->useJ
9590: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
95a0: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
95b0: 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
95c0: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73  LMODE_OFF || !is
95d0: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a  Open(p->jfd) );.
95e0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
95f0: 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e   MEMDB implies n
9600: 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e  oSync. And an in
9610: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
9620: 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69   Since .  ** thi
9630: 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65  s means an in-me
9640: 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f  mory pager perfo
9650: 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c  rms no IO at all
9660: 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f  , it cannot enco
9670: 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68  unter .  ** eith
9680: 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  er SQLITE_IOERR 
9690: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64  or SQLITE_FULL d
96a0: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f  uring rollback o
96b0: 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69  r while finalizi
96c0: 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e  ng .  ** a journ
96d0: 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75  al file. (althou
96e0: 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  gh the in-memory
96f0: 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65   journal impleme
9700: 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a  ntation may .  *
9710: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
9720: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c  IOERR_NOMEM whil
9730: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
9740: 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  le is being writ
9750: 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69  ten). It .  ** i
9760: 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20  s therefore not 
9770: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20  possible for an 
9780: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
9790: 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
97a0: 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a  OR .  ** state..
97b0: 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42    */.  if( MEMDB
97c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
97d0: 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20  p->noSync );.   
97e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
97f0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9800: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
9810: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
9820: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9830: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
9840: 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20  MORY .    );.   
9850: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61   assert( p->eSta
9860: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
9870: 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41  && p->eState!=PA
9880: 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
9890: 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
98a0: 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d  Wal(p)==0 );.  }
98b0: 0a 0a 20 20 2f 2a 20 41 20 73 6f 72 74 65 72 20  ..  /* A sorter 
98c0: 69 73 20 61 20 74 65 6d 70 20 66 69 6c 65 20 74  is a temp file t
98d0: 68 61 74 20 6e 65 76 65 72 20 73 70 69 6c 6c 73  hat never spills
98e0: 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 61 6c 77   to disk and alw
98f0: 61 79 73 20 68 61 73 0a 20 20 2a 2a 20 74 68 65  ays has.  ** the
9900: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67   doNotSpill flag
9910: 20 73 65 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20   set.  */.  if( 
9920: 70 2d 3e 69 73 53 6f 72 74 65 72 20 29 7b 0a 20  p->isSorter ){. 
9930: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65     assert( p->te
9940: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 61 73  mpFile );.    as
9950: 73 65 72 74 28 20 70 2d 3e 64 6f 4e 6f 74 53 70  sert( p->doNotSp
9960: 69 6c 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ill );.    asser
9970: 74 28 20 70 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  t( p->fd->pMetho
9980: 64 73 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  ds==0 );.  }..  
9990: 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e  /* If changeCoun
99a0: 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20  tDone is set, a 
99b0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72  RESERVED lock or
99c0: 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
99d0: 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68   held.  ** on th
99e0: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  e file..  */.  a
99f0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
9a00: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d  hangeCountDone==
9a10: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
9a20: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9a30: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9a40: 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ->eLock!=PENDING
9a50: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74  _LOCK );..  swit
9a60: 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b  ch( p->eState ){
9a70: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
9a80: 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  OPEN:.      asse
9a90: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
9aa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9ab0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9ac0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9ad0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9ae0: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
9af0: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
9b00: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  0 || pPager->tem
9b10: 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62  pFile );.      b
9b20: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9b30: 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20  PAGER_READER:.  
9b40: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9b50: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9b60: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9b70: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9b80: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
9b90: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9ba0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  p->eLock>=SHARED
9bb0: 5f 4c 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65  _LOCK || p->noRe
9bc0: 61 64 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  adlock );.      
9bd0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9be0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
9bf0: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
9c00: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9c10: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
9c20: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9c30: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9c40: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9c50: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
9c60: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
9c70: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9c80: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9c90: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
9ca0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9cb0: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
9cc0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
9cd0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9ce0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
9cf0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
9d00: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
9d10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9d20: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
9d30: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
9d40: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9d50: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
9d60: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
9d70: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9d80: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
9d90: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
9da0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9db0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9dc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9dd0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9de0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9df0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
9e00: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
9e10: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
9e20: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
9e30: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
9e40: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
9e50: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
9e60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
9e70: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
9e80: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
9e90: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
9ea0: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
9eb0: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
9ec0: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
9ed0: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
9ee0: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
9ef0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
9f00: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
9f10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9f20: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
9f30: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
9f40: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
9f50: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
9f60: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9f70: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9f80: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
9fa0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9fb0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9fc0: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
9fd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9fe0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9ff0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a000: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a010: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a020: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a030: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a040: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a050: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a060: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a070: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a080: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a090: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a0a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a0b0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a0c0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a0d0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a0e0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a0f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a100: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a110: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a120: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a130: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a140: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a150: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a160: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a170: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a180: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a190: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a1a0: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a1b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a1c0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
a1d0: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a1e0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a1f0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a200: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
a210: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a220: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a230: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a240: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a250: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a260: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a270: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
a280: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
a290: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a2a0: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a2b0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a2c0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a2d0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a2f0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a300: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a310: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
a320: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a330: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
a340: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
a350: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
a360: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
a370: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
a380: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
a390: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
a3a0: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
a3b0: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
a3c0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
a3d0: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
a3e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
a3f0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
a400: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a410: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
a420: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a430: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
a440: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
a450: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
a460: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a470: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a480: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a490: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a4a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a4b0: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a4c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a4d0: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a4e0: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
a4f0: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
a500: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
a510: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
a520: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
a530: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
a540: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
a550: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
a560: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
a570: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
a580: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
a590: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
a5a0: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
a5b0: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
a5c0: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
a5d0: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
a5e0: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
a5f0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
a600: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
a610: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
a620: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
a630: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
a640: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
a650: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
a660: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
a670: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
a680: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
a690: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
a6a0: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
a6b0: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
a6c0: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
a6d0: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
a6e0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
a6f0: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
a700: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
a710: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
a720: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
a730: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
a740: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
a750: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
a760: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
a770: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
a780: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
a790: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
a7a0: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
a7b0: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
a7c0: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
a7d0: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
a7e0: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
a7f0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a800: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
a810: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
a820: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
a830: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a840: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
a850: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
a860: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a870: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
a880: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
a890: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
a8a0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a8b0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
a8c0: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
a8d0: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
a8e0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a8f0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
a900: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
a910: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
a920: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
a930: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
a940: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
a950: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
a960: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
a970: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
a980: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
a990: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
a9a0: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
a9b0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
a9c0: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
a9d0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
a9e0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a9f0: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
aa00: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
aa10: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
aa20: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
aa30: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
aa40: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
aa50: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
aa60: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
aa70: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
aa80: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
aa90: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
aaa0: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
aab0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
aac0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
aad0: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
aae0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aaf0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ab00: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
ab10: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
ab20: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ab30: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ab40: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
ab50: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
ab60: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ab70: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ab80: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
ab90: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
aba0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
abb0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
abc0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
abd0: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
abe0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
abf0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ac00: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
ac10: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
ac20: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
ac30: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
ac40: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
ac50: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
ac60: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
ac70: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
ac80: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
ac90: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
aca0: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
acb0: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
acc0: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
acd0: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
ace0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
acf0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
ad00: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
ad10: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
ad20: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
ad30: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
ad40: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
ad50: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
ad60: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
ad70: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
ad80: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
ad90: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
ada0: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
adb0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
adc0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
add0: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
ade0: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
adf0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
ae00: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
ae10: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
ae20: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
ae30: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
ae40: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
ae50: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
ae60: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
ae70: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
ae80: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
ae90: 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
aea0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
aeb0: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a  Pager;.  int i;.
aec0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
aed0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
aee0: 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72   i++){.    Pager
aef0: 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
af00: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
af10: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
af20: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
af30: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
af40: 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65  cTest(p->pInSave
af50: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
af60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
af70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
af80: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
af90: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
afa0: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
afb0: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
afc0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
afd0: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
afe0: 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  al(PgHdr *pPg){.
aff0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b000: 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e  BitvecTest(pPg->
b010: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
b020: 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
b030: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
b040: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
b050: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
b060: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b070: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
b080: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
b090: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
b0a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b0b0: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b0c0: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
b0d0: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b0e0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b0f0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
b100: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
b110: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
b120: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
b130: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
b140: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
b150: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
b160: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
b170: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
b180: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b190: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
b1a0: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
b1b0: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b1c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
b1d0: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
b1e0: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
b1f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b200: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b210: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b220: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
b230: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
b240: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
b250: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
b260: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
b270: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
b280: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
b290: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b2a0: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
b2b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b2c0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b2d0: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
b2e0: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
b2f0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
b300: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
b310: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
b320: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b330: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b340: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
b350: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
b360: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
b370: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b380: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
b390: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
b3a0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
b3b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
b3c0: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
b3d0: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
b3e0: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
b3f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
b400: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
b410: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
b420: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
b430: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
b440: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
b450: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
b460: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
b470: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
b480: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b490: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b4a0: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b4b0: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b4c0: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
b4d0: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
b4e0: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
b4f0: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b500: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
b510: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b520: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
b530: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b540: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
b550: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
b560: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
b570: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b580: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
b590: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
b5a0: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
b5b0: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
b5c0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b5d0: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
b5e0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b5f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
b600: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
b610: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
b620: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
b630: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
b640: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
b650: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
b660: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
b670: 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  = sqlite3OsUnloc
b680: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
b690: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ock);.    if( pP
b6a0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  ager->eLock!=UNK
b6b0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
b6c0: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
b6d0: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
b6e0: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
b6f0: 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  ("UNLOCK %p %d\n
b700: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
b710: 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  )).  }.  return 
b720: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
b730: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b740: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b750: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b760: 65 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f  e either SHARED_
b770: 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45  LOCK,.** RESERVE
b780: 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53  D_LOCK or EXCLUS
b790: 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65  IVE_LOCK. If the
b7a0: 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65   caller is succe
b7b0: 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a  ssful, set the.*
b7c0: 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  * Pager.eLock va
b7d0: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65  riable to the ne
b7e0: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e  w locking state.
b7f0: 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
b800: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b810: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b820: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b830: 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  function is .** 
b840: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
b850: 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20  odify it unless 
b860: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
b870: 73 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49  state is EXCLUSI
b880: 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65  VE_LOCK. .** See
b890: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
b8a0: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
b8b0: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
b8c0: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
b8d0: 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a  n .** of this..*
b8e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
b8f0: 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  erLockDb(Pager *
b900: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
b910: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
b920: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
b930: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  ert( eLock==SHAR
b940: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
b950: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
b960: 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  || eLock==EXCLUS
b970: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  IVE_LOCK );.  if
b980: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
b990: 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  eLock || pPager-
b9a0: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
b9b0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
b9c0: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
b9d0: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
b9e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
b9f0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
ba00: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
ba10: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
ba20: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
ba30: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
ba40: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
ba50: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
ba60: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
ba70: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
ba80: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
ba90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
baa0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bab0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
bac0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bad0: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
bae0: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
baf0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bb00: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
bb10: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bb20: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bb30: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bb40: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bb50: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bb60: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bb70: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bb80: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bb90: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bba0: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
bbb0: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
bbc0: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
bbd0: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
bbe0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
bbf0: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
bc00: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
bc10: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
bc20: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
bc30: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
bc40: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
bc50: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
bc60: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
bc70: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
bc80: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
bc90: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
bca0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
bcb0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
bcc0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
bcd0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
bce0: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
bcf0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
bd00: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
bd10: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
bd20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
bd30: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
bd40: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
bd50: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
bd60: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
bd70: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
bd80: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
bd90: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
bda0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
bdb0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
bdc0: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
bdd0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
bde0: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
be10: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
be20: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
be30: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
be40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
be50: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
be60: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be80: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
be90: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
bea0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
beb0: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
bec0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
bed0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
bee0: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
bef0: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
bf00: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
bf10: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
bf20: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
bf30: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
bf40: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
bf50: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
bf60: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
bf70: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
bf80: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
bf90: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
bfa0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
bfb0: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
bfc0: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
bfd0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
bfe0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
bff0: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c000: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c010: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c020: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c030: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c040: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c050: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c060: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c070: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c080: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c090: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c0a0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c0b0: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c0c0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c0d0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c0e0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c0f0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c100: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c110: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c120: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c130: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c140: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c150: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c160: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c170: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c180: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c190: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c1a0: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c1b0: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c1c0: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c1d0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c1e0: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c1f0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c200: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c210: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c220: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c230: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c240: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c250: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c260: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c270: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c280: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c290: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c2a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c2b0: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c2c0: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c2d0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c2e0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c2f0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c300: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c310: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c320: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c330: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c340: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c350: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c360: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c370: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c380: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c390: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c3a0: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c3b0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c3c0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c3d0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c3e0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c3f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c400: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c410: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c420: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c430: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c440: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c450: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c460: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c470: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c480: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c490: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c4a0: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c4b0: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c4c0: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c4d0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c4e0: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c4f0: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c500: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c510: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c520: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c530: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c540: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c550: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c560: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c570: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c580: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c590: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c5a0: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
c5b0: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
c5c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
c5d0: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
c5e0: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
c5f0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
c600: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
c610: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
c620: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
c630: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
c640: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
c650: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
c660: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
c670: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
c680: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
c690: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
c6a0: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
c6b0: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
c6c0: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
c6d0: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
c6e0: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
c6f0: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
c700: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
c710: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
c720: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
c730: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
c740: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
c750: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
c760: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
c770: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
c780: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
c790: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
c7a0: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
c7b0: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
c7c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
c7d0: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
c7e0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
c7f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
c800: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c810: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
c820: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
c830: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
c840: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
c850: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
c860: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
c870: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
c880: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
c890: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
c8a0: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
c8b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
c8c0: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
c8d0: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
c8e0: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
c8f0: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
c900: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c910: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
c920: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
c930: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
c940: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
c950: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
c960: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
c970: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
c980: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c990: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
c9a0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
c9b0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
c9c0: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
c9d0: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
c9e0: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
c9f0: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
ca00: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
ca10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
ca20: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ca30: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
ca40: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
ca50: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
ca60: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
ca70: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
ca80: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
caa0: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cab0: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cac0: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cad0: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
caf0: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
cb00: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
cb10: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb30: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
cb40: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cb50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cb60: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cb70: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cb80: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cb90: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cba0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
cbb0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cbc0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cbd0: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
cbe0: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
cbf0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cc00: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cc10: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
cc20: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
cc30: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
cc40: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cc50: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
cc60: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
cc70: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
cc80: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
cc90: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
cca0: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
ccb0: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
ccc0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
ccd0: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
cce0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ccf0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
cd00: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
cd10: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
cd20: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
cd30: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
cd40: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
cd50: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
cd60: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cd70: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
cd80: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
cd90: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
cda0: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
cdb0: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
cdc0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
cdd0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
cde0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
cdf0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
ce00: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
ce10: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
ce20: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
ce30: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
ce40: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
ce50: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
ce60: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
ce70: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
ce80: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
ce90: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
cea0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
ceb0: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
cec0: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
ced0: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
cee0: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
cef0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cf00: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
cf10: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
cf20: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
cf30: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
cf40: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
cf50: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
cf60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
cf70: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
cf80: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
cf90: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
cfa0: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
cfb0: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
cfc0: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
cfd0: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
cfe0: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
cff0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
d000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d020: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
d050: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
d060: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
d070: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
d080: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d090: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
d0b0: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
d0c0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
d0d0: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
d0e0: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
d0f0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
d100: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d110: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
d120: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
d130: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
d140: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
d150: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
d160: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
d170: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
d180: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d190: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
d1a0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
d1b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
d1c0: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
d1d0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d1e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
d1f0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
d200: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
d210: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
d220: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d230: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
d240: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d250: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
d260: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
d270: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
d280: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
d290: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
d2a0: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
d2b0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
d2c0: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
d2d0: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
d2e0: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
d2f0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d300: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
d310: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
d320: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
d330: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
d340: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
d350: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
d360: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
d370: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
d380: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
d390: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
d3a0: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
d3b0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
d3c0: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
d3d0: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
d3e0: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
d3f0: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
d400: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
d410: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
d420: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
d430: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
d440: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
d450: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
d460: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
d470: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
d480: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
d490: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
d4a0: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
d4b0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
d4c0: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
d4d0: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
d4e0: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
d4f0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
d500: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
d510: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
d520: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
d530: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
d540: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
d550: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
d560: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
d570: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
d580: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
d590: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
d5a0: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
d5b0: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
d5c0: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
d5d0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
d5e0: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
d5f0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
d600: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
d610: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
d620: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
d650: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
d660: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
d670: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
d680: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
d690: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
d6a0: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
d6b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
d6c0: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
d6d0: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
d6e0: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
d6f0: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
d700: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
d710: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
d720: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
d730: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d740: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
d750: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
d760: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d770: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
d780: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
d790: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
d7a0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
d7b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
d7c0: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
d7d0: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
d7e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d7f0: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
d800: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
d810: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d820: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
d830: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
d840: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
d850: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
d860: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
d870: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
d880: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
d890: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
d8a0: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
d8b0: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
d8c0: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
d8d0: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
d8e0: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
d8f0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
d900: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
d910: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
d920: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
d930: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
d940: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
d950: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
d960: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
d970: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
d980: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
d990: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
d9a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
d9b0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
d9c0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
d9d0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
d9e0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
d9f0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
da00: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
da10: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
da20: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
da30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
da40: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
da50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
da60: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
da70: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
da80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
da90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
daa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
dab0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
dac0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
dad0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
dae0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
daf0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
db00: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
db10: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
db20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
db30: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
db40: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
db50: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
db60: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
db70: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
db80: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
db90: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
dba0: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
dbb0: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
dbc0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
dbd0: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
dbe0: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
dbf0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
dc00: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
dc10: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
dc20: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
dc30: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
dc40: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
dc50: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
dc60: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
dc70: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
dc80: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
dc90: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
dca0: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
dcb0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
dcc0: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
dcd0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
dce0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
dcf0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
dd00: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
dd10: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
dd20: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
dd30: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
dd40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dd50: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
dd60: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
dd70: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
dd80: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
dd90: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
dda0: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
ddb0: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
ddc0: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
ddd0: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
dde0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
ddf0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
de00: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
de10: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
de20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
de30: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
de40: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
de50: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
de80: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
de90: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
dea0: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
deb0: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
dec0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
ded0: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
dee0: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
def0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
df00: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
df10: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
df20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
df30: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
df40: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
df50: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
df60: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
df70: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
df80: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
df90: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
dfa0: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
dfb0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
dfc0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
dfd0: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
dfe0: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
dff0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e000: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e010: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e020: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e030: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e040: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e050: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e060: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e070: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e080: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e090: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e0a0: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e0b0: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e0c0: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e0d0: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e0e0: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e0f0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e100: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e110: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e120: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e130: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e140: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e150: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e160: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e170: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e180: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e190: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e1a0: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e1b0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e1c0: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e1d0: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e1e0: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e1f0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e200: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e210: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e220: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e230: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e240: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e250: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e260: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
e270: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
e280: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
e290: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
e2a0: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
e2b0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e2c0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
e2d0: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
e2e0: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
e2f0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
e300: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
e310: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
e320: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
e330: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
e340: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
e350: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
e360: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
e370: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
e380: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
e390: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
e3a0: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
e3b0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
e3c0: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
e3d0: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
e3e0: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
e3f0: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
e400: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
e410: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
e420: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
e430: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
e440: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
e450: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
e460: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
e470: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
e480: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
e490: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
e4a0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
e4b0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e4c0: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
e4d0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
e4e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
e4f0: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
e500: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
e510: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
e520: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
e530: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
e540: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
e550: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
e560: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
e570: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
e580: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
e590: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
e5a0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e5b0: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
e5c0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e5d0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e5e0: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
e5f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
e600: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
e610: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e620: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
e630: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
e640: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
e650: 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71  ialiser */ .  sq
e660: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
e670: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
e680: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
e690: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
e6a0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
e6b0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
e6c0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
e6d0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e6e0: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
e6f0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
e700: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
e710: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
e720: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e730: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
e740: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
e750: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
e760: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
e770: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
e780: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e790: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e7a0: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
e7b0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
e7c0: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
e7d0: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
e7e0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
e7f0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e800: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
e810: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
e820: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
e830: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
e840: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
e850: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
e860: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
e870: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
e880: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
e890: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
e8a0: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
e8b0: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
e8c0: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
e8d0: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
e8e0: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
e8f0: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
e900: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
e910: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
e920: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e930: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
e940: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
e950: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
e960: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
e970: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
e980: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
e990: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
e9a0: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
e9b0: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
e9c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
e9d0: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
e9e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
e9f0: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
ea00: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
ea10: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
ea20: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
ea30: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
ea40: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
ea50: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
ea60: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
ea70: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
ea80: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
ea90: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
eaa0: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
eab0: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
eac0: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
ead0: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
eae0: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
eaf0: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
eb00: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
eb10: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
eb20: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
eb30: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
eb40: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
eb50: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
eb60: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
eb70: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
eb80: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
eb90: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
eba0: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
ebb0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
ebc0: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
ebd0: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
ebe0: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
ebf0: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
ec00: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
ec10: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
ec20: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
ec30: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
ec40: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
ec50: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
ec60: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
ec70: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
ec80: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
ec90: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
eca0: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
ecb0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
ecc0: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
ecd0: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
ece0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
ecf0: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
ed00: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
ed10: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
ed20: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
ed30: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
ed40: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
ed50: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
ed60: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
ed70: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
ed80: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
ed90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
eda0: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
edb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
edc0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
edd0: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
ede0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
edf0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
ee00: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
ee10: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
ee20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
ee30: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
ee40: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
ee50: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
ee60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
ee70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
ee80: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
ee90: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
eea0: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
eeb0: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
eec0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
eed0: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
eee0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
eef0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
ef00: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
ef10: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
ef20: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
ef30: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
ef40: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
ef50: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
ef60: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
ef70: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
ef80: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
ef90: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
efa0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
efb0: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
efc0: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
efd0: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
efe0: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
eff0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f000: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f010: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f020: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f030: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f040: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f050: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f060: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f070: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f080: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f090: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f0a0: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f0b0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f0c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f0d0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f0e0: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f0f0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f100: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f110: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f120: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f130: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f140: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f150: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f160: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f170: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f180: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f190: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f1a0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f1b0: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f1c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f1d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f1e0: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f1f0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f210: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f220: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f230: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f250: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f260: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f270: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
f280: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
f290: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f2a0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f2b0: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
f2c0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
f2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f2e0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
f2f0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f300: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
f310: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
f340: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
f350: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
f360: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
f370: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
f380: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
f390: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
f3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f3b0: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
f3c0: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
f3d0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
f3e0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
f3f0: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
f400: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
f410: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
f420: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
f430: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
f440: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
f450: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
f460: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
f470: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
f480: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
f490: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
f4a0: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
f4b0: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
f4c0: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
f4d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f4e0: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
f4f0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
f500: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
f510: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
f520: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
f530: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
f540: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f550: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
f560: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
f570: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
f580: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
f590: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
f5a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f5b0: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
f5c0: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
f5d0: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
f5e0: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
f5f0: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
f600: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
f610: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
f620: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
f630: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
f640: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
f650: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
f660: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
f670: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
f680: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
f690: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
f6a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
f6b0: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
f6c0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
f6d0: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
f6e0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
f6f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f710: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
f720: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
f730: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
f740: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f750: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
f760: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
f770: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
f780: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
f790: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f7a0: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
f7b0: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
f7c0: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
f7d0: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
f7e0: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
f7f0: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
f800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f810: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
f820: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
f830: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
f840: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
f850: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
f860: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
f870: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
f880: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
f890: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f8a0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
f8b0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
f8c0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
f8d0: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
f8e0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f8f0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
f900: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
f910: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
f920: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f930: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
f940: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
f950: 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
f960: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
f970: 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
f980: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
f990: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
f9a0: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f9c0: 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
f9d0: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
f9e0: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
f9f0: 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
fa00: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
fa10: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fa20: 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
fa30: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
fa40: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fa50: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fa60: 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
fa70: 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
fa80: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
fa90: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
faa0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
fab0: 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
fac0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
fad0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fae0: 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
faf0: 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
fb00: 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
fb10: 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
fb20: 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
fb30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
fb40: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
fb50: 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
fb60: 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
fb70: 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
fb80: 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
fb90: 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
fba0: 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
fbb0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
fbc0: 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
fbd0: 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
fbe0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
fbf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
fc00: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
fc10: 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
fc20: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
fc30: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
fc40: 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
fc50: 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
fc60: 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
fc70: 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
fc80: 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
fc90: 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
fca0: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
fcb0: 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
fcc0: 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
fcd0: 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
fce0: 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
fcf0: 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
fd00: 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
fd10: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
fd20: 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
fd30: 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
fd40: 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
fd50: 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
fd60: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
fd70: 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
fd80: 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
fd90: 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
fda0: 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
fdb0: 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
fdc0: 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
fdd0: 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
fde0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
fdf0: 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
fe00: 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
fe10: 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
fe20: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
fe30: 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
fe40: 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
fe50: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
fe60: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
fe70: 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
fe80: 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
fe90: 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
fea0: 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
feb0: 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
fec0: 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
fed0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
fee0: 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
fef0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
ff00: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
ff10: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
ff20: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
ff30: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
ff40: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
ff50: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
ff60: 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
ff70: 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
ff80: 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
ff90: 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
ffa0: 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
ffb0: 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
ffc0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
ffd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ffe0: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
fff0: 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
10000 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
10010 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
10020 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
10030 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
10040 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10050 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10060 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
10070 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
10080 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
10090 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
100a0 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
100b0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
100c0 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
100d0 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
100e0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
100f0 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
10100 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
10110 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
10120 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
10130 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
10140 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10150 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10160 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
10170 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
10180 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
10190 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
101a0 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
101b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
101c0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
101d0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
101e0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
101f0 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
10200 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10210 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
10220 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
10230 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
10240 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10250 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10260 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10270 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
10280 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
10290 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
102a0 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
102b0 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
102c0 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
102d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
102e0 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
102f0 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
10300 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
10310 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
10320 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
10330 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
10340 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10350 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10360 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
10370 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10380 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
10390 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
103a0 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
103b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
103c0 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
103d0 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
103e0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
103f0 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
10400 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
10410 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
10420 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
10430 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
10440 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10450 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10460 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
10470 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
10480 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
10490 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
104a0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
104b0 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
104c0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
104d0 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
104e0 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
104f0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
10500 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
10510 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
10520 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
10530 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
10540 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10550 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10560 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10570 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10590 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
105a0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
105b0 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
105d0 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
105e0 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
105f0 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10610 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
10620 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
10630 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
10640 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10660 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10670 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10680 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106a0 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
106b0 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
106c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
106d0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
106e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
106f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
10700 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
10710 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
10720 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
10730 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
10740 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10750 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
10760 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
10770 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
10780 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
107a0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
107b0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
107c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
107d0 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
107e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
107f0 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
10800 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
10810 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
10820 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
10830 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
10840 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
10850 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
10860 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10870 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
10880 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
10890 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
108a0 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
108b0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
108c0 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
108d0 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
108e0 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
108f0 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
10900 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
10910 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
10920 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
10930 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
10940 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
10950 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
10960 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10970 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
10980 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
10990 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
109a0 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
109b0 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
109c0 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
109d0 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
109e0 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
109f0 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
10a00 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
10a10 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
10a20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
10a30 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
10a40 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
10a50 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
10a60 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
10a70 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10a80 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10a90 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
10aa0 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
10ab0 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
10ac0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
10ad0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
10ae0 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
10af0 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
10b00 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10b10 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10b20 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10b30 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
10b40 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10b50 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10b60 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10b70 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
10b80 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
10b90 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
10ba0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
10bb0 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
10bc0 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
10bd0 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
10be0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
10bf0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
10c00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10c10 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
10c20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
10c30 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
10c40 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
10c50 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
10c60 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
10c70 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
10c80 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
10c90 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10ca0 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
10cb0 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
10cc0 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
10cd0 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
10ce0 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
10cf0 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
10d00 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
10d10 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
10d20 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
10d30 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
10d40 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
10d50 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
10d60 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
10d70 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
10d80 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
10d90 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
10da0 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
10db0 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
10dc0 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
10dd0 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
10de0 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
10df0 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
10e00 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
10e10 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
10e20 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
10e30 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
10e40 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
10e50 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
10e60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
10e70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10e80 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
10e90 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
10ea0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
10eb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10ec0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
10ed0 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
10ee0 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
10ef0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74  page number. Ret
10f00 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
10f10 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
10f20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75  NULL if the requ
10f30 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
10f40 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  t .** already in
10f50 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
10f60 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
10f70 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
10f80 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
10f90 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
10fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fb0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
10fc0 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  value */..  /* I
10fd0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
10fe0 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20  e for a call to 
10ff0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69  PcacheFetch() wi
11000 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30  th createFlag==0
11010 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73   to.  ** fail, s
11020 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20  ince no attempt 
11030 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61  to allocate dyna
11040 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  mic memory will 
11050 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
11060 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61  (void)sqlite3Pca
11070 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
11080 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
11090 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
110a0 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   p;.}../*.** Dis
110b0 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20  card the entire 
110c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
110d0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63  in-memory page-c
110e0 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ache..*/.static 
110f0 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
11100 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11110 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
11120 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
11130 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69  pBackup);.  sqli
11140 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
11150 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
11160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11170 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
11180 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
11190 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
111a0 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
111b0 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
111c0 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
111d0 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
111e0 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
111f0 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
11200 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
11210 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11220 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
11230 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11240 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11250 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11260 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11270 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
11280 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
11290 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
112a0 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
112b0 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
112c0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
112d0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
112e0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
112f0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11300 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
11310 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
11320 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
11330 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
11340 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
11350 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11360 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11370 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
11380 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
11390 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
113a0 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
113b0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
113c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
113d0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
113e0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
113f0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
11400 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
11410 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
11420 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
11430 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
11440 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
11450 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
11460 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
11470 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
11480 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
11490 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
114a0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
114b0 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
114c0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
114d0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
114e0 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
114f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11500 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11510 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
11520 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
11530 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
11540 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
11550 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11560 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11570 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
11580 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
11590 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
115a0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
115b0 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
115c0 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
115d0 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
115e0 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
115f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11600 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11610 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11620 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11630 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
11640 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
11650 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11660 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11670 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
11680 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
11690 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
116a0 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
116b0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
116c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
116d0 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
116e0 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
116f0 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
11700 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11710 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11720 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
11730 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11740 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
11750 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
11760 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
11770 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
11780 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
11790 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
117a0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
117b0 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
117c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
117d0 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
117e0 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
117f0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
11800 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
11810 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
11820 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
11830 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
11840 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
11850 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
11860 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
11870 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
11880 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
11890 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
118a0 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
118b0 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
118c0 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
118d0 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
118e0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
118f0 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
11900 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
11910 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
11920 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
11930 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
11940 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
11950 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
11960 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
11970 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
11980 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11990 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
119a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
119b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
119c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
119d0 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
119e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
119f0 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
11a00 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
11a10 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
11a20 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
11a30 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11a40 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11a50 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
11a60 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
11a70 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11a80 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
11a90 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
11aa0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
11ab0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
11ac0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
11ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
11ae0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
11af0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
11b00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
11b10 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
11b20 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
11b30 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11b40 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
11b50 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11b70 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
11b80 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
11b90 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
11ba0 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
11bb0 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
11bc0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
11bd0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
11be0 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
11bf0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11c00 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
11c10 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
11c20 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
11c30 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
11c40 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
11c50 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
11c60 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
11c70 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
11c80 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
11c90 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
11ca0 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
11cb0 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
11cc0 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
11cd0 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
11ce0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11cf0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
11d00 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
11d10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11d20 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11d30 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
11d40 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11d50 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11d60 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
11d70 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11d80 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11d90 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
11da0 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
11db0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11dc0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
11dd0 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
11de0 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
11df0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
11e00 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
11e10 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
11e20 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
11e30 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
11e40 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
11e50 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
11e60 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
11e70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11e80 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
11e90 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
11ea0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
11eb0 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
11ec0 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
11ed0 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
11ee0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
11ef0 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
11f00 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
11f10 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
11f20 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
11f30 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
11f40 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
11f50 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
11f60 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
11f70 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
11f80 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
11f90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
11fa0 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
11fb0 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
11fc0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
11fd0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
11fe0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11ff0 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
12000 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
12010 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
12020 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
12030 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
12040 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
12050 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
12060 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
12070 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
12080 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
12090 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
120a0 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
120b0 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
120c0 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
120d0 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
120e0 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
120f0 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
12100 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12110 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
12120 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
12130 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
12140 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12150 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
12160 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12170 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12180 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
12190 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
121a0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
121b0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
121c0 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
121d0 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
121e0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
121f0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
12200 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
12210 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
12220 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
12230 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
12240 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
12250 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
12260 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
12270 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
12280 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
12290 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
122a0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
122b0 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
122c0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
122d0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
122e0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
122f0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
12300 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12310 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12320 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
12330 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
12340 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
12350 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
12360 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12370 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  lHdr = 0;.  pPag
12380 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
12390 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
123a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
123b0 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20  led whenever an 
123c0 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72  IOERR or FULL er
123d0 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65  ror that require
123e0 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74  s.** the pager t
123f0 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74  o transition int
12400 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
12410 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72  e may ahve occur
12420 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  red..** The firs
12430 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
12440 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
12450 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
12460 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74  the second .** t
12470 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
12480 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
12490 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
124a0 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  I function. The 
124b0 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e  .** value return
124c0 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
124d0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
124e0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
124f0 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
12500 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12510 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55  ent is SQLITE_FU
12520 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
12530 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a   or one of the.*
12540 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65  * IOERR sub-code
12550 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74  s, the pager ent
12560 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74  ers the ERROR st
12570 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ate and the erro
12580 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f  r code.** is sto
12590 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72  red in Pager.err
125a0 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20  Code. While the 
125b0 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e  pager remains in
125c0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
125d0 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41  ,.** all major A
125e0 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20  PI calls on the 
125f0 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
12600 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61  iately return Pa
12610 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a  ger.errCode..**.
12620 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61  ** The ERROR sta
12630 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  te indicates tha
12640 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
12650 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
12660 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
12670 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
12680 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
12690 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
126a0 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
126b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
126c0 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
126d0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
126e0 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
126f0 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
12700 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ent error occurr
12710 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
12720 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
12730 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
12740 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74  replayed to rest
12750 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ore the contents
12760 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12770 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20   file (as if.** 
12780 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f  it were a hot-jo
12790 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  urnal)..*/.stati
127a0 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
127b0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
127c0 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
127d0 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
127e0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
127f0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
12800 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a  DB );.  assert(.
12810 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
12820 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
12830 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
12840 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
12850 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
12860 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
12870 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
12880 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
12890 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
128a0 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51  _FULL || rc2==SQ
128b0 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
128c0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
128d0 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
128e0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
128f0 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  ER_ERROR;.  }.  
12900 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12910 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12920 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
12930 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
12940 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
12950 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
12960 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
12970 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
12980 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
12990 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
129a0 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
129b0 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
129c0 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
129d0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
129e0 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
129f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
12a00 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
12a10 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
12a20 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
12a30 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
12a40 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  n..** .** This r
12a50 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
12a60 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f  called in PAGER_
12a70 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20  ERROR state. If 
12a80 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  it is called.** 
12a90 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72  in PAGER_NONE or
12aa0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
12ab0 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ate and the lock
12ac0 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a   held is less.**
12ad0 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20   exclusive than 
12ae0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  a RESERVED lock,
12af0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
12b00 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
12b10 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
12b20 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
12b30 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
12b40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
12b50 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
12b60 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
12b70 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
12b80 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
12b90 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
12ba0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
12bb0 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
12bc0 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
12bd0 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
12be0 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
12bf0 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
12c00 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
12c10 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
12c20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12c30 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
12c40 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
12c50 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
12c60 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
12c70 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
12c80 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
12c90 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
12ca0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
12cb0 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
12cc0 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
12cd0 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
12ce0 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
12cf0 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
12d00 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
12d10 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
12d20 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
12d30 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
12d40 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
12d50 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
12d60 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
12d70 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
12d80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
12d90 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
12da0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
12db0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
12dc0 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
12dd0 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
12de0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
12df0 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
12e00 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
12e10 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
12e20 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
12e30 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
12e40 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
12e50 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
12e60 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
12e70 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
12e80 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
12e90 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
12ea0 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12eb0 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
12ec0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12ed0 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
12ee0 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
12ef0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
12f00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
12f10 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
12f20 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
12f30 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
12f40 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
12f50 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
12f60 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
12f70 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
12f80 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
12f90 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
12fa0 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
12fb0 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
12fc0 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
12fd0 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
12fe0 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
12ff0 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
13000 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
13010 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
13020 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
13030 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  ized, the pager 
13040 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52  moves to PAGER_R
13050 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20  EADER state..** 
13060 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f  If running in no
13070 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c  n-exclusive roll
13080 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c  back mode, the l
13090 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
130a0 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65  is .** downgrade
130b0 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f  d to a SHARED_LO
130c0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  CK..**.** SQLITE
130d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
130e0 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
130f0 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
13100 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a  occurs during.**
13110 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f   any of the IO o
13120 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e  perations to fin
13130 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
13140 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b  l file or unlock
13150 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
13160 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
13170 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
13180 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
13190 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72   If the .** oper
131a0 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a  ation to finaliz
131b0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
131c0 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  le fails, then t
131d0 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a  he code still.**
131e0 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b   tries to unlock
131f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13200 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63  le if not in exc
13210 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20  lusive mode. If 
13220 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70  the.** unlock op
13230 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73  eration fails as
13240 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   well, then the 
13250 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65  first error code
13260 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74   related.** to t
13270 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65  he first error e
13280 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20  ncountered (the 
13290 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
132a0 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20  tion one) is.** 
132b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
132c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
132d0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
132e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
132f0 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69   hasMaster){.  i
13300 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13310 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72  K;      /* Error
13320 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e   code from journ
13330 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
13340 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
13350 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
13360 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72  OK;     /* Error
13370 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69   code from db fi
13380 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  le unlock operat
13390 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20  ion */..  /* Do 
133a0 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65 20 70  nothing if the p
133b0 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
133c0 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
133d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
133e0 2a 20 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20  * or at least a 
133f0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54  RESERVED lock. T
13400 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
13410 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
13420 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
13430 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
13440 6f 6e 20 61 63 74 69 76 65 20 62 75 74 20 61 20  on active but a 
13450 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
13460 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a  ter lock is.  **
13470 20 68 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20   held under two 
13480 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20  circumstances:. 
13490 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66   **.  **   1. Af
134a0 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75 6c  ter a successful
134b0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
134c0 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c  lback, it is cal
134d0 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20  led with.  **   
134e0 20 20 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52     eState==PAGER
134f0 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d  _NONE and eLock=
13500 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e  =EXCLUSIVE_LOCK.
13510 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20  .  **.  **   2. 
13520 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  If a connection 
13530 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  with locking_mod
13540 65 3d 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64  e=exclusive hold
13550 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
13560 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b   .  **      lock
13570 20 73 77 69 74 63 68 65 73 20 62 61 63 6b 20 74   switches back t
13580 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e  o locking_mode=n
13590 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65  ormal and then e
135a0 78 65 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20  xecutes a.  **  
135b0 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63      read-transac
135c0 74 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74  tion, this funct
135d0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ion is called wi
135e0 74 68 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52  th eState==PAGER
135f0 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20  _READER .  **   
13600 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58     and eLock==EX
13610 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65  CLUSIVE_LOCK whe
13620 6e 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  n the read-trans
13630 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64  action is closed
13640 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13650 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
13660 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
13670 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13680 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
13690 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50  RROR );.  if( pP
136a0 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47  ager->eState<PAG
136b0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
136c0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
136d0 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  k<RESERVED_LOCK 
136e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
136f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
13700 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
13710 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ints(pPager);.  
13720 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
13730 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
13740 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13750 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  l==0 );.  if( is
13760 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
13770 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
13780 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
13790 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ager) );..    /*
137a0 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   Finalize the jo
137b0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
137c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
137d0 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
137e0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
137f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13800 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13810 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13820 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20  MEMORY );.      
13830 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
13840 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
13850 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
13860 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
13870 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13880 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20  E_TRUNCATE ){.  
13890 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
138a0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
138b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
138c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
138d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
138e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
138f0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
13900 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
13910 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
13920 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
13930 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
13940 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
13950 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13960 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c  _PERSIST.      |
13970 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
13980 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
13990 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
139a0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
139b0 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20  DE_WAL).    ){. 
139c0 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f       rc = zeroJo
139d0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
139e0 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20   hasMaster);.   
139f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
13a00 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
13a10 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
13a20 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62  his branch may b
13a30 65 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20  e executed with 
13a40 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
13a50 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20  e==MEMORY if.   
13a60 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72     ** a hot-jour
13a70 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c  nal was just rol
13a80 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69  led back. In thi
13a90 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
13aa0 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  al.      ** file
13ab0 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
13ac0 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49  d and deleted. I
13ad0 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
13ae0 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20  n writes to.    
13af0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
13b00 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20  e file, it will 
13b10 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69  do so using an i
13b20 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
13b30 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
13b40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13b50 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
13b60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13b70 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20  _DELETE .       
13b80 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
13b90 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13ba0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
13bb0 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20  MORY .          
13bc0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
13bd0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13be0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
13bf0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
13c00 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
13c10 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
13c20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
13c30 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
13c40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13c50 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
13c60 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
13c70 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
13c80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23    }.    }.  }..#
13c90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
13ca0 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74  CK_PAGES.  sqlit
13cb0 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
13cc0 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
13cd0 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
13ce0 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28  pagehash);.  if(
13cf0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
13d00 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61  =0 && sqlite3Pca
13d10 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
13d20 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
13d30 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
13d40 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
13d50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66  ager, 1);.    if
13d60 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ( p ){.      p->
13d70 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20  pageHash = 0;.  
13d80 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
13d90 55 6e 72 65 66 28 70 29 3b 0a 20 20 20 20 7d 0a  Unref(p);.    }.
13da0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
13db0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
13dc0 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
13dd0 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
13de0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
13df0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
13e00 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
13e10 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
13e20 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
13e30 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54    sqlite3PcacheT
13e40 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
13e50 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d  pPCache, pPager-
13e60 3e 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28  >dbSize);..  if(
13e70 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
13e80 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44  ger) ){.    /* D
13e90 72 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74  rop the WAL writ
13ea0 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20  e-lock, if any. 
13eb0 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e  Also, if the con
13ec0 6e 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a  nection was in .
13ed0 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d      ** locking_m
13ee0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
13ef0 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e  de but is no lon
13f00 67 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58  ger, drop the EX
13f10 43 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20  CLUSIVE .    ** 
13f20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
13f30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
13f40 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d      */.    rc2 =
13f50 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72   sqlite3WalEndWr
13f60 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  iteTransaction(p
13f70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
13f80 20 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53    assert( rc2==S
13f90 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
13fa0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
13fb0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
13fc0 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61   && (!pagerUseWa
13fd0 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c  l(pPager) || sql
13fe0 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
13ff0 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
14000 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20  l, 0)).  ){.    
14010 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63  rc2 = pagerUnloc
14020 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
14030 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
14040 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
14050 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  tDone = 0;.  }. 
14060 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
14070 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
14080 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
14090 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75  ter = 0;..  retu
140a0 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
140b0 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
140c0 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
140d0 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
140e0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
140f0 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
14100 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
14110 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
14120 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
14130 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
14140 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20  ERROR state, do 
14150 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
14160 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
14170 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
14180 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
14190 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
141a0 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
141b0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
141c0 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
141d0 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
141e0 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
141f0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f  base file and mo
14200 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63  ve the pager bac
14210 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
14220 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61   If this .** mea
14230 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
14240 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c   a hot-journal l
14250 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
14260 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74  system, the next
14270 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   .** connection 
14280 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
14290 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  ed lock on the p
142a0 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20  ager (which may 
142b0 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a  be this one) .**
142c0 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61   will roll it ba
142d0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
142e0 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61   pager has not a
142f0 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
14300 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
14310 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20  but an IO or.** 
14320 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
14330 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  urs during a rol
14340 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73  lback, then this
14350 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75   will itself cau
14360 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  se .** the pager
14370 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
14380 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68  ROR state. Which
14390 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
143a0 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20   by the.** call 
143b0 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
143c0 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ), as described 
143d0 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
143e0 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
143f0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
14400 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
14410 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
14420 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26  e!=PAGER_ERROR &
14430 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
14440 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a  !=PAGER_OPEN ){.
14450 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
14460 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
14470 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66  Pager) );.    if
14480 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14490 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
144a0 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73  OCKED ){.      s
144b0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
144c0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
144d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
144e0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
144f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
14500 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
14510 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
14520 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
14530 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ode ){.      ass
14540 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
14550 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
14560 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  R );.      pager
14570 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
14580 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
14590 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75   }.  }.  pager_u
145a0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d  nlock(pPager);.}
145b0 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
145c0 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69  r aData must poi
145d0 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
145e0 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  f pPager->pageSi
145f0 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  ze bytes.** of d
14600 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64  ata. Compute and
14610 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
14620 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65  um based ont the
14630 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
14640 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74   .** page of dat
14650 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  a and the curren
14660 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65  t value of pPage
14670 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a  r->cksumInit..**
14680 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
14690 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
146a0 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
146b0 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
146c0 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
146d0 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67  tial value (pPag
146e0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61  er->cksumInit) a
146f0 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20 62  nd every 200th b
14700 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  yte.** of the pa
14710 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e  ge data, startin
14720 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66 73  g with byte offs
14730 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65  et (pPager->page
14740 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61  Size%200)..** Ea
14750 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
14760 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62  preted as an 8-b
14770 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  it unsigned inte
14780 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  ger..**.** Chang
14790 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20  ing the formula 
147a0 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
147b0 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65  this checksum re
147c0 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69  sults in an.** i
147d0 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72  ncompatible jour
147e0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  nal file format.
147f0 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61  .**.** If journa
14800 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  l corruption occ
14810 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
14820 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
14830 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20  most likely .** 
14840 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74  scenario is that
14850 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
14860 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
14870 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
14880 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d  ged. .** It is m
14890 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
148a0 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
148b0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
148c0 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
148d0 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
148e0 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
148f0 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
14900 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
14910 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
14920 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
14930 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
14940 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
14950 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  f corruption..*/
14960 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
14970 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
14980 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  Pager, const u8 
14990 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
149a0 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
149b0 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
149c0 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61    /* Checksum va
149d0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
149e0 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65  .  int i = pPage
149f0 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b  r->pageSize-200;
14a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
14a10 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77  p counter */.  w
14a20 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20  hile( i>0 ){.   
14a30 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b   cksum += aData[
14a40 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30  i];.    i -= 200
14a50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
14a60 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ksum;.}../*.** R
14a70 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e  eport the curren
14a80 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
14a90 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
14aa0 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a  ed bytes back.**
14ab0 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a   to the codec..*
14ac0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
14ad0 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63  HAS_CODEC.static
14ae0 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72   void pagerRepor
14af0 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  tSize(Pager *pPa
14b00 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
14b10 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
14b20 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ng ){.    pPager
14b30 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
14b40 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c  (pPager->pCodec,
14b50 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
14b60 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
14b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
14b80 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  nt)pPager->nRese
14b90 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  rve);.  }.}.#els
14ba0 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
14bb0 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20  ReportSize(X)   
14bc0 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65    /* No-op if we
14bd0 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
14be0 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69  a codec */.#endi
14bf0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
14c00 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
14c10 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
14c20 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
14c30 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
14c40 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
14c50 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
14c60 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
14c70 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
14c80 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
14c90 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
14ca0 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
14cb0 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
14cc0 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
14cd0 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
14ce0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
14cf0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
14d00 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
14d10 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
14d20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65  journal uses che
14d30 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
14d40 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
14d50 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a  oes .** not..**.
14d60 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  ** If the page n
14d70 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
14d80 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72  e record read fr
14d90 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
14da0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
14db0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
14dc0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
14dd0 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
14de0 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73  then playback is
14df0 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20  .** skipped and 
14e00 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
14e10 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
14e20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pDone is not NUL
14e30 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
14e40 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20  record of pages 
14e50 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64  that have alread
14e60 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64  y.** been played
14e70 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70   back.  If the p
14e80 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20  age at *pOffset 
14e90 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
14ea0 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20   played back.** 
14eb0 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f  (if the correspo
14ec0 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20  nding pDone bit 
14ed0 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69  is set) then ski
14ee0 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a  p the playback..
14ef0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
14f00 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65   pDone bit corre
14f10 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
14f20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73  *pOffset page is
14f30 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f   set.** prior to
14f40 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
14f50 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  * If the page re
14f60 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66  cord is successf
14f70 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
14f80 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
14f90 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61   file.** and pla
14fa0 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53  yed back, then S
14fb0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
14fc0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
14fd0 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77  rror occurs.** w
14fe0 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65  hile reading the
14ff0 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
15000 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
15010 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69  ile or while wri
15020 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64  ting.** to the d
15030 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
15040 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
15050 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
15060 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20  . If data.** is 
15070 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
15080 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
15090 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75  )journal file bu
150a0 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a  t appears to be.
150b0 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  ** corrupted, SQ
150c0 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
150d0 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63  urned. Data is c
150e0 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70  onsidered corrup
150f0 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69  ted in.** two ci
15100 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20  rcumstances:.** 
15110 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
15120 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65  ecord page-numbe
15130 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20  r is illegal (0 
15140 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  or PAGER_MJ_PGNO
15150 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20  ), or.**   * If 
15160 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65  the record is be
15170 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
15180 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
15190 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
151a0 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73    and the checks
151b0 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f  um field does no
151c0 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f  t match the reco
151d0 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  rd content..**.*
151e0 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65  * Neither of the
151f0 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  se two scenarios
15200 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75   are possible du
15210 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
15220 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
15230 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61   If this is a sa
15240 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15250 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
15260 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e  y have to be dyn
15270 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
15280 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
15290 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
152a0 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
152b0 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  an allocation fa
152c0 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ils,.** SQLITE_N
152d0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
152e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
152f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
15300 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
15310 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
15320 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15330 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
15340 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34  ed back */.  i64
15350 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20   *pOffset,      
15360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
15370 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74  fset of record t
15380 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20  o playback */.  
15390 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20  Bitvec *pDone,  
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
153b0 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
153c0 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20   already played 
153d0 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73  back */.  int is
153e0 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20  MainJrnl,       
153f0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20          /* 1 -> 
15400 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20  main journal. 0 
15410 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  -> sub-journal. 
15420 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
15430 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
15440 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
15450 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
15460 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ack */.){.  int 
15470 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
15480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15490 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
154a0 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
154b0 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
154c0 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
154d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
154e0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
154f0 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
15500 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
15530 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
15540 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61  hecking */.  cha
15550 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  r *aData;       
15560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
15570 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20  mporary storage 
15580 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
15590 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
155a0 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  jfd;            
155b0 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
155c0 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  riptor for the j
155d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
155e0 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20   int isSynced;  
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15600 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
15610 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65 64  l page is synced
15620 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
15630 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d  isMainJrnl&~1)==
15640 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d  0 );      /* isM
15650 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20  ainJrnl is 0 or 
15660 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  1 */.  assert( (
15670 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30  isSavepnt&~1)==0
15680 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53   );       /* isS
15690 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31  avepnt is 0 or 1
156a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
156b0 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e  MainJrnl || pDon
156c0 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e  e );     /* pDon
156d0 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e  e always used on
156e0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
156f0 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76  .  assert( isSav
15700 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30  epnt || pDone==0
15710 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e   );   /* pDone n
15720 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e  ever used on non
15730 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20  -savepoint */.. 
15740 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d   aData = pPager-
15750 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73  >pTmpSpace;.  as
15760 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20 20  sert( aData );  
15770 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
15780 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76 65  torage must have
15790 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
157a0 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73  located */.  ass
157b0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
157c0 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28  (pPager)==0 || (
157d0 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69  !isMainJrnl && i
157e0 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20  sSavepnt) );..  
157f0 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73 74  /* Either the st
15800 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ate is greater t
15810 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52  han PAGER_WRITER
15820 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61  _CACHEMOD (a tra
15830 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
15840 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  r savepoint roll
15850 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65  back done at the
15860 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65 20   request of the 
15870 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20  caller) or this 
15880 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  is.  ** a hot-jo
15890 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
158a0 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a  If it is a hot-j
158b0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
158c0 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
158d0 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e  is in state OPEN
158e0 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58   and holds an EX
158f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f  CLUSIVE lock. Ho
15900 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
15910 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61  ck.  ** only rea
15920 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
15930 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68   journal, not th
15940 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
15950 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
15960 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
15970 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
15980 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  MOD.       || (p
15990 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
159a0 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61  AGER_OPEN && pPa
159b0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
159c0 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
159d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
159e0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
159f0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
15a00 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29   || isMainJrnl )
15a10 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
15a20 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
15a30 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20   page data from 
15a40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  the journal or s
15a50 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  ub-journal.  ** 
15a60 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20  file. Return an 
15a70 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
15a80 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49  e caller if an I
15a90 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  O error occurs..
15aa0 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d    */.  jfd = isM
15ab0 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72  ainJrnl ? pPager
15ac0 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
15ad0 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61  sjfd;.  rc = rea
15ae0 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f  d32bits(jfd, *pO
15af0 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20  ffset, &pgno);. 
15b00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15b10 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
15b20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15b30 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61  Read(jfd, (u8*)a
15b40 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
15b50 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65  geSize, (*pOffse
15b60 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  t)+4);.  if( rc!
15b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
15b80 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73  urn rc;.  *pOffs
15b90 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  et += pPager->pa
15ba0 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d  geSize + 4 + isM
15bb0 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a  ainJrnl*4;..  /*
15bc0 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
15bd0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
15be0 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
15bf0 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
15c00 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
15c10 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
15c20 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
15c30 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
15c40 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
15c50 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
15c60 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
15c70 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
15c80 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
15c90 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
15ca0 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
15cb0 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
15cc0 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
15cd0 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
15ce0 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
15cf0 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
15d00 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
15d10 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
15d20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70  assert( !isSavep
15d30 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt );.    return
15d40 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
15d50 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  }.  if( pgno>(Pg
15d60 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
15d70 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  e || sqlite3Bitv
15d80 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67  ecTest(pDone, pg
15d90 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  no) ){.    retur
15da0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15db0 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
15dc0 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
15dd0 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a  ad32bits(jfd, (*
15de0 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73  pOffset)-4, &cks
15df0 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
15e00 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
15e10 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20   if( !isSavepnt 
15e20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  && pager_cksum(p
15e30 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74  Pager, (u8*)aDat
15e40 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
15e50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15e60 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
15e70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
15e80 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
15e90 62 65 65 6e 20 70 6c 61 79 65 64 20 62 79 20 62  been played by b
15ea0 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65  efore during the
15eb0 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f   current.  ** ro
15ec0 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e  llback, then don
15ed0 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61  't bother to pla
15ee0 79 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e  y it back again.
15ef0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e  .  */.  if( pDon
15f00 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74  e && (rc = sqlit
15f10 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e  e3BitvecSet(pDon
15f20 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54  e, pgno))!=SQLIT
15f30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
15f40 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
15f50 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61   When playing ba
15f60 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f  ck page 1, resto
15f70 72 65 20 74 68 65 20 6e 52 65 73 65 72 76 65 20  re the nReserve 
15f80 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69  setting.  */.  i
15f90 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  f( pgno==1 && pP
15fa0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d  ager->nReserve!=
15fb0 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
15fc0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
15fd0 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a  nReserve = ((u8*
15fe0 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20  )aData)[20];.   
15ff0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
16000 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
16010 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
16020 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20   is in CACHEMOD 
16030 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
16040 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
16050 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
16060 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
16070 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
16080 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
16090 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
160a0 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
160b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
160c0 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
160d0 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
160e0 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
160f0 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20  ** An exception 
16100 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c  to the above rul
16110 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e: If the databa
16120 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  se is in no-sync
16130 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61   mode.  ** and a
16140 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64   page is moved d
16150 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  uring an increme
16160 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e  ntal vacuum then
16170 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20   the page may.  
16180 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ** not be in the
16190 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61   pager cache. La
161a0 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63  ter: if a malloc
161b0 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f  () or IO error o
161c0 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
161d0 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63  g a Movepage() c
161e0 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61  all, then the pa
161f0 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ge may not be in
16200 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20   the cache.  ** 
16210 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63  either. So the c
16220 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
16230 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  ed in the above 
16240 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74  paragraph is not
16250 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62  .  ** assert()ab
16260 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  le..  **.  ** If
16270 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44   in WRITER_DBMOD
16280 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  , WRITER_FINISHE
16290 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c  D or OPEN state,
162a0 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
162b0 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63  the.  ** pager c
162c0 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
162d0 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  s and the main f
162e0 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
162f0 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20   then marked .  
16300 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69  ** not dirty. Si
16310 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20 69 73  nce this code is
16320 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69   only executed i
16330 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
16340 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f  te for.  ** a ho
16350 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
16360 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e  ck, it is guaran
16370 74 65 65 64 20 74 68 61 74 20 74 68 65 20 70 61  teed that the pa
16380 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74  ge-cache is empt
16390 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61  y.  ** if the pa
163a0 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73  ger is in OPEN s
163b0 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tate..  **.  ** 
163c0 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
163d0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
163e0 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
163f0 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
16400 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
16410 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
16420 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
16430 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
16440 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
16450 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
16460 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
16470 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
16480 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
16490 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
164a0 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
164b0 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
164c0 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
164d0 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
164e0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
164f0 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
16500 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
16510 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
16520 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
16530 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
16540 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
16550 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
16560 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
16570 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
16580 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
16590 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
165a0 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
165b0 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
165c0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
165d0 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
165e0 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
165f0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
16600 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
16610 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
16620 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
16630 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
16640 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
16650 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
16660 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
16670 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
16680 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
16690 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
166a0 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
166b0 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
166c0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
166d0 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
166e0 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
166f0 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
16700 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
16710 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
16720 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
16730 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
16740 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
16750 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
16760 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
16770 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
16780 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
16790 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
167a0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
167b0 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
167c0 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
167d0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
167e0 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
167f0 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
16800 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
16810 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
16820 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
16830 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  /.  if( pagerUse
16840 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
16850 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
16860 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  lse{.    pPg = p
16870 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
16880 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  er, pgno);.  }. 
16890 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20   assert( pPg || 
168a0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
168b0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
168c0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te!=PAGER_OPEN |
168d0 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41  | pPg==0 );.  PA
168e0 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
168f0 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
16900 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
16910 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45  .           PAGE
16920 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
16930 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
16940 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
16950 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c  ze, (u8*)aData),
16960 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d  .           (isM
16970 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
16980 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
16990 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
169a0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
169b0 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70      isSynced = p
169c0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
169d0 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50   (*pOffset <= pP
169e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
169f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16a00 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d  isSynced = (pPg=
16a10 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66  =0 || 0==(pPg->f
16a20 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
16a30 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20  D_SYNC));.  }.  
16a40 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
16a50 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50  r->fd).   && (pP
16a60 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
16a70 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
16a80 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
16a90 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
16aa0 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20     && isSynced. 
16ab0 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
16ac0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
16ad0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
16ae0 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
16af0 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
16b00 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66  Pg!=0 && (pPg->f
16b10 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
16b20 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20  SYNC)!=0 );.    
16b30 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
16b40 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
16b50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16b60 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
16b70 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20  fd, (u8*)aData, 
16b80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16b90 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28  , ofst);.    if(
16ba0 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
16bb0 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
16bc0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
16bd0 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
16be0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
16bf0 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20  r->pBackup ){.  
16c00 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
16c10 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
16c20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
16c30 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EM);.      sqlit
16c40 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
16c50 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
16c60 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61  pgno, (u8*)aData
16c70 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  );.      CODEC2(
16c80 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
16c90 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54  gno, 7, rc=SQLIT
16ca0 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b  E_NOMEM, aData);
16cb0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
16cc0 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  f( !isMainJrnl &
16cd0 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  & pPg==0 ){.    
16ce0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
16cf0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61  rollback of a sa
16d00 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61  vepoint and data
16d10 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e   was not written
16d20 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
16d30 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
16d40 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d  page is not in-m
16d50 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20  emory, there is 
16d60 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20  a potential.    
16d70 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e  ** problem. When
16d80 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78   the page is nex
16d90 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65  t fetched by the
16da0 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69   b-tree layer, i
16db0 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  t .    ** will b
16dc0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
16dd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
16de0 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
16df0 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63  not be .    ** c
16e00 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a  urrent. .    **.
16e10 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
16e20 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
16e30 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73  ferent ways this
16e40 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c   can happen. All
16e50 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a   are quite.    *
16e60 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20  * obscure. When 
16e70 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68  running in synch
16e80 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69  ronous mode, thi
16e90 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
16ea0 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  n .    ** if the
16eb0 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20   page is on the 
16ec0 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65  free-list at the
16ed0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
16ee0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a  ansaction, then.
16ef0 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64      ** populated
16f00 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69  , then moved usi
16f10 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ng sqlite3PagerM
16f20 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a  ovepage()..    *
16f30 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
16f40 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20  ution is to add 
16f50 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
16f60 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63  e to the cache c
16f70 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  ontaining.    **
16f80 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72   the data just r
16f90 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ead from the sub
16fa0 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74  -journal. Mark t
16fb0 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
16fc0 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20   .    ** and if 
16fd0 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72  the pager requir
16fe0 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  es a journal-syn
16ff0 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65  c, then mark the
17000 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a   page as .    **
17010 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75   requiring a jou
17020 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65  rnal-sync before
17030 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a   it is written..
17040 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
17050 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  t( isSavepnt );.
17060 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
17070 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d  er->doNotSpill==
17080 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
17090 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20  >doNotSpill++;. 
170a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
170b0 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
170c0 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
170d0 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
170e0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
170f0 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  ll==1 );.    pPa
17100 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d  ger->doNotSpill-
17110 2d 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  -;.    if( rc!=S
17120 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
17130 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66  n rc;.    pPg->f
17140 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
17150 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71  EED_READ;.    sq
17160 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
17170 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20  irty(pPg);.  }. 
17180 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
17190 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
171a0 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
171b0 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
171c0 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
171d0 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
171e0 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
171f0 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
17200 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
17210 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
17220 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
17230 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
17240 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
17250 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
17260 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
17270 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
17280 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
17290 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
172a0 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
172b0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
172c0 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
172d0 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
172e0 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d      pData = pPg-
172f0 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63  >pData;.    memc
17300 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61  py(pData, (u8*)a
17310 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
17320 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61  geSize);.    pPa
17330 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
17340 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d  Pg);.    if( isM
17350 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53  ainJrnl && (!isS
17360 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73  avepnt || *pOffs
17370 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  et<=pPager->jour
17380 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20  nalHdr) ){.     
17390 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65   /* If the conte
173a0 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
173b0 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f   were just resto
173c0 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  red from the mai
173d0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  n .      ** jour
173e0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
173f0 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20  ts content must 
17400 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20  be as they were 
17410 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  when the .      
17420 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
17430 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  as first opened.
17440 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
17450 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61   can mark the pa
17460 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63  ge.      ** as c
17470 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72  lean, since ther
17480 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65  e will be no nee
17490 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75  d to write it ou
174a0 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
174b0 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  * database..    
174c0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
174d0 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70  ere is one excep
174e0 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c  tion to this rul
174f0 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  e. If the page i
17500 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20  s being rolled. 
17510 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20       ** back as 
17520 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f  part of a savepo
17530 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  int (or statemen
17540 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  t) rollback from
17550 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e   an .      ** un
17560 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
17570 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
17580 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
17590 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20   is not safe.   
175a0 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68     ** to mark th
175b0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
175c0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
175d0 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67   marking the pag
175e0 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c  e as.      ** cl
175f0 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74  ean will clear t
17600 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
17610 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74  NC flag. Since t
17620 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20  he page is.     
17630 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74   ** already in t
17640 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
17650 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67  (recorded in Pag
17660 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61  er.pInJournal) a
17670 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
17680 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
17690 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c  flag is cleared,
176a0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
176b0 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20  written to.     
176c0 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e   ** again within
176d0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
176e0 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61  n, it will be ma
176f0 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75  rked as dirty bu
17700 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  t.      ** the P
17710 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
17720 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lag will not be 
17730 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68  set. It could th
17740 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  en potentially. 
17750 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74       ** be writt
17760 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20  en out into the 
17770 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
17780 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  fore its journal
17790 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73   file.      ** s
177a0 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64  egment is synced
177b0 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63  . If a crash occ
177c0 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f  urs during or fo
177d0 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20  llowing this,.  
177e0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
177f0 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65  corruption may e
17800 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nsue..      */. 
17810 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
17820 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
17830 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
17840 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
17850 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  n(pPg);.    }.  
17860 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
17870 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20  hash(pPg);..    
17880 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
17890 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
178a0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
178b0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
178c0 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
178d0 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
178e0 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
178f0 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
17900 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
17910 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
17920 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
17930 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
17940 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
17950 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
17960 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
17970 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
17980 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
17990 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
179a0 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  ->pgno, 3, rc=SQ
179b0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
179c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
179d0 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
179e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
179f0 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
17a00 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
17a10 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
17a20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
17a30 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
17a40 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
17a50 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
17a60 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
17a70 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
17a80 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
17a90 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
17aa0 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
17ab0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
17ac0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
17ad0 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
17ae0 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
17af0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a  **.** Argument z
17b00 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74  Master may point
17b10 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70   to Pager.pTmpSp
17b20 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66  ace. So that buf
17b30 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  fer is not .** a
17b40 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
17b50 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
17b60 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ction..**.** Whe
17b70 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  n a master journ
17b80 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  al file is creat
17b90 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61  ed, it is popula
17ba0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
17bb0 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  es .** of all of
17bc0 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e   its child journ
17bd0 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61  als, one after a
17be0 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65  nother, formatte
17bf0 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65  d as utf-8 .** e
17c00 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65  ncoded text. The
17c10 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69   end of each chi
17c20 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld journal file 
17c30 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61  is marked with a
17c40 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   .** nul-termina
17c50 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e  tor byte (0x00).
17c60 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65   i.e. the entire
17c70 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d   contents of a m
17c80 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
17c90 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e   file for a tran
17ca0 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e  saction involvin
17cb0 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20  g two databases 
17cc0 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  might be:.**.** 
17cd0 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e    "/home/bill/a.
17ce0 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68  db-journal\x00/h
17cf0 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f  ome/bill/b.db-jo
17d00 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a  urnal\x00".**.**
17d10 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   A master journa
17d20 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20  l file may only 
17d30 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20  be deleted once 
17d40 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
17d50 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61   .** journals ha
17d60 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  ve been rolled b
17d70 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
17d80 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74  function reads t
17d90 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17da0 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
17db0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20  l file into .** 
17dc0 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73  memory and loops
17dd0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66   through each of
17de0 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
17df0 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a  al names. For.**
17e00 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
17e10 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69  nal, it checks i
17e20 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20  f:.**.**   * if 
17e30 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
17e40 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66  l exists, and if
17e50 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68   so.**   * if th
17e60 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
17e70 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72  contains a refer
17e80 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a  ence to master j
17e90 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66  ournal .**     f
17ea0 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a  ile zMaster.**.*
17eb0 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75  * If a child jou
17ec0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
17ed0 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62  d that matches b
17ee0 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65  oth of the crite
17ef0 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ria.** above, th
17f00 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
17f10 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  rns without doin
17f20 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65  g anything. Othe
17f30 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20  rwise, if.** no 
17f40 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  such child journ
17f50 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  al can be found,
17f60 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73   file zMaster is
17f70 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a   deleted from.**
17f80 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
17f90 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
17fa0 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
17fb0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77  If an IO error w
17fc0 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
17fd0 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ion, an error co
17fe0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
17ff0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
18000 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72   allocates memor
18010 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  y by calling sql
18020 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66  ite3Malloc(). If
18030 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a   an allocation.*
18040 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
18050 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
18060 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
18070 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   no IO or malloc
18080 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75   errors .** occu
18090 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
180a0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
180b0 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74  TODO: This funct
180c0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ion allocates a 
180d0 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20  single block of 
180e0 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a  memory to load.*
180f0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  * the entire con
18100 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
18110 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18120 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  . This could be.
18130 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b  ** a couple of k
18140 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d  ilobytes or so -
18150 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72   potentially lar
18160 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67  ger than the pag
18170 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73  e .** size..*/.s
18180 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
18190 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20  delmaster(Pager 
181a0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
181b0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
181c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
181d0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
181e0 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  s;.  int rc;    
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18200 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
18210 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
18220 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20  *pMaster;    /* 
18230 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d  Malloc'd master-
18240 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
18250 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c  criptor */.  sql
18260 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
18270 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  nal;   /* Malloc
18280 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c  'd child-journal
18290 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
182a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
182b0 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
182c0 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
182d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
182e0 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
182f0 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
18300 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
18310 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18320 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
18330 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
18340 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e  /* Pointer to on
18350 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e  e journal within
18360 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68   MJ file */.  ch
18370 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20  ar *zMasterPtr; 
18380 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
18390 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65   to hold MJ file
183a0 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72  name from a jour
183b0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
183c0 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20  t nMasterPtr;   
183d0 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e          /* Amoun
183e0 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  t of space alloc
183f0 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50  ated to zMasterP
18400 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  tr[] */..  /* Al
18410 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
18420 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e   both the pJourn
18430 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66  al and pMaster f
18440 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e  ile descriptors.
18450 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73  .  ** If success
18460 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61  ful, open the ma
18470 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18480 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20  e for reading.. 
18490 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
184a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
184b0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
184c0 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  o(pVfs->szOsFile
184d0 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
184e0 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
184f0 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
18500 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
18510 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
18520 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
18530 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
18540 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
18550 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
18560 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
18570 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
18580 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
18590 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
185a0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
185b0 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
185c0 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
185d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
185e0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
185f0 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a  aster_out;..  /*
18600 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
18610 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18620 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
18630 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
18640 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
18650 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
18660 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
18670 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74  rnal.   Also obt
18680 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69  ain.  ** suffici
18690 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d  ent space (in zM
186a0 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c  asterPtr) to hol
186b0 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d  d the names of m
186c0 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e  aster.  ** journ
186d0 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74  al files extract
186e0 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20  ed from regular 
186f0 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
18700 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
18710 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
18720 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
18730 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
18740 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18750 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
18760 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50  _out;.  nMasterP
18770 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  tr = pVfs->mxPat
18780 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74  hname+1;.  zMast
18790 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  erJournal = sqli
187a0 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e  te3Malloc((int)n
187b0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20  MasterJournal + 
187c0 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b  nMasterPtr + 1);
187d0 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a  .  if( !zMasterJ
187e0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63  ournal ){.    rc
187f0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
18800 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73  .    goto delmas
18810 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a  ter_out;.  }.  z
18820 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
18830 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
18840 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20  terJournal+1];. 
18850 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
18860 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
18870 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e  sterJournal, (in
18880 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  t)nMasterJournal
18890 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
188a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
188b0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
188c0 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
188d0 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d  [nMasterJournal]
188e0 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61   = 0;..  zJourna
188f0 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
18900 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a  al;.  while( (zJ
18910 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
18920 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
18930 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  urnal ){.    int
18940 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20   exists;.    rc 
18950 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
18960 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
18970 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
18980 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
18990 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
189a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
189b0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
189c0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
189d0 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  f( exists ){.   
189e0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
189f0 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
18a00 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
18a10 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
18a20 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  s..      ** Open
18a30 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
18a40 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
18a50 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18a60 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f  . If.      ** so
18a70 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
18a80 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
18a90 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18aa0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
18ab0 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69    int c;.      i
18ac0 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
18ad0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
18ae0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
18af0 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
18b00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18b10 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
18b20 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
18b30 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
18b40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18b50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
18b60 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18b70 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18b80 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
18b90 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
18ba0 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
18bb0 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
18bc0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
18bd0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
18be0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18bf0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
18c00 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18c10 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18c20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
18c30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
18c40 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
18c50 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66  er)==0;.      if
18c60 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ( c ){.        /
18c70 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
18c80 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
18c90 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18ca0 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
18cb0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18cc0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18cd0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72  .    }.    zJour
18ce0 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
18cf0 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
18d00 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71  )+1);.  }. .  sq
18d10 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
18d20 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ster);.  rc = sq
18d30 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
18d40 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
18d50 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
18d60 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
18d70 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
18d80 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
18d90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
18da0 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
18db0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
18dc0 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
18dd0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18de0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
18df0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
18e00 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
18e10 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
18e20 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
18e30 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
18e40 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
18e50 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
18e60 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
18e70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
18e80 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
18e90 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
18ea0 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
18eb0 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
18ec0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
18ed0 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
18ee0 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
18ef0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
18f00 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65  not open, or the
18f10 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
18f20 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44   either.** DBMOD
18f30 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
18f40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
18f50 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
18f60 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a  ise, the size .*
18f70 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
18f80 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67   changed to nPag
18f90 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70  e pages (nPage*p
18fa0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
18fb0 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74  bytes). .** If t
18fc0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
18fd0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72  is currently lar
18fe0 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70  ger than nPage p
18ff0 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74  ages, then use t
19000 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63  he VFS.** xTrunc
19010 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20  ate() method to 
19020 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a  truncate it..**.
19030 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20  ** Or, it might 
19040 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
19050 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
19060 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
19070 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67  er than .** nPag
19080 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70  e pages. Some op
19090 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
190a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63  mplementations c
190b0 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  an get confused 
190c0 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74  if .** you try t
190d0 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  o truncate a fil
190e0 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74  e to some size t
190f0 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
19100 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e  an it .** curren
19110 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63  tly is, so detec
19120 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20  t this case and 
19130 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a  write a single z
19140 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20  ero byte to .** 
19150 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e  the end of the n
19160 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  ew file instead.
19170 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
19180 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c  sful, return SQL
19190 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
191a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
191b0 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a  ile modifying.**
191c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
191d0 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  le, return the e
191e0 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
191f0 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
19200 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
19210 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
19220 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
19230 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
19240 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
19250 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
19260 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
19270 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19280 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
19290 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20  _READER );.  .  
192a0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
192b0 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70  r->fd) .   && (p
192c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
192d0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
192e0 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
192f0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
19300 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63   .  ){.    i64 c
19310 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
19320 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50  ize;.    int szP
19330 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
19340 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
19350 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
19360 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
19370 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  K );.    /* TODO
19380 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20  : Is it safe to 
19390 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  use Pager.dbFile
193a0 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20  Size here? */.  
193b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
193c0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
193d0 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a  >fd, &currentSiz
193e0 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  e);.    newSize 
193f0 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50  = szPage*(i64)nP
19400 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
19410 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
19420 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
19430 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
19440 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
19450 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
19460 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
19470 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
19480 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
19490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
194a0 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50   char *pTmp = pP
194b0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
194c0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
194d0 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29  pTmp, 0, szPage)
194e0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
194f0 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50  se( (newSize-szP
19500 61 67 65 29 20 3c 20 20 63 75 72 72 65 6e 74 53  age) <  currentS
19510 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ize );.        t
19520 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a  estcase( (newSiz
19530 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72  e-szPage) == cur
19540 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  rentSize );.    
19550 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
19560 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e  ewSize-szPage) >
19570 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b    currentSize );
19580 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
19590 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
195a0 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73  ger->fd, pTmp, s
195b0 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73  zPage, newSize-s
195c0 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zPage);.      }.
195d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
195e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
195f0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
19600 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
19610 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19620 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19630 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
19640 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65  alue of the Page
19650 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
19660 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69  iable for the gi
19670 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73  ven.** pager bas
19680 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ed on the value 
19690 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
196a0 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68  xSectorSize meth
196b0 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65  od.** of the ope
196c0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
196d0 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
196e0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73   will be used us
196f0 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ed .** to determ
19700 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64  ine the size and
19710 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f   alignment of jo
19720 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
19730 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72   .** master jour
19740 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74  nal pointers wit
19750 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72  hin created jour
19760 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
19770 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
19780 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69  iles the effecti
19790 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
197a0 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  s always 512 byt
197b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
197c0 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d  ise, for non-tem
197d0 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
197e0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
197f0 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68  or size is.** th
19800 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
19810 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
19820 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75  ize() method rou
19830 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66  nded up to 32 if
19840 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74  .** it is less t
19850 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64  han 32, or round
19860 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53  ed down to MAX_S
19870 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74  ECTOR_SIZE if it
19880 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
19890 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  han MAX_SECTOR_S
198a0 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  IZE..*/.static v
198b0 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
198c0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
198d0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  {.  assert( isOp
198e0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
198f0 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
19900 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  le );..  if( !pP
19910 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
19920 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20  {.    /* Sector 
19930 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74  size doesn't mat
19940 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  ter for temporar
19950 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74  y files. Also, t
19960 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d  he file.    ** m
19970 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ay not have been
19980 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20   opened yet, in 
19990 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f  which case the O
199a0 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
199b0 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73    ** call will s
199c0 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a  egfault..    */.
199d0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
199e0 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
199f0 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
19a00 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20  ger->fd);.  }.  
19a10 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
19a20 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20  orSize<32 ){.   
19a30 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
19a40 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20  ize = 512;.  }. 
19a50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
19a60 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
19a70 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61  OR_SIZE ){.    a
19a80 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f  ssert( MAX_SECTO
19a90 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20  R_SIZE>=512 );. 
19aa0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
19ab0 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54  rSize = MAX_SECT
19ac0 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a  OR_SIZE;.  }.}..
19ad0 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
19ae0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
19af0 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
19b00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
19b10 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
19b20 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
19b30 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
19b40 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
19b50 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
19b60 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
19b70 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
19b80 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
19b90 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
19ba0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
19bb0 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
19bc0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
19bd0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
19be0 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
19bf0 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
19c00 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
19c10 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
19c20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
19c30 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
19c40 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
19c50 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
19c60 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
19c70 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
19c80 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
19c90 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
19ca0 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
19cb0 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
19cc0 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
19cd0 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
19ce0 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
19cf0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
19d00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
19d10 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
19d20 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
19d30 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
19d40 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
19d50 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  5)  4 byte big-e
19d60 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
19d70 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f  ich is the secto
19d80 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61  r size.  The hea
19d90 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20  der.**       is 
19da0 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
19db0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29  in size..**  (6)
19dc0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
19dd0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
19de0 68 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69  h is the page si
19df0 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72  ze..**  (7)  zer
19e00 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f  o padding out to
19e10 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
19e20 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20   size..**  (8)  
19e30 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
19e40 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
19e50 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
19e60 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
19e70 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
19e80 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
19e90 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
19ea0 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
19eb0 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
19ec0 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
19ed0 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
19ee0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
19ef0 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
19f00 20 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61   first 7 items a
19f10 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
19f20 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
19f30 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
19f40 65 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65  e of the 8th ite
19f50 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
19f60 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
19f70 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
19f80 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
19f90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
19fa0 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
19fb0 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
19fc0 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
19fd0 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
19fe0 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
19ff0 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
1a000 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
1a010 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
1a020 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
1a030 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
1a040 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
1a050 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
1a060 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
1a070 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
1a080 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
1a090 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
1a0a0 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
1a0b0 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
1a0c0 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
1a0d0 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
1a0e0 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
1a0f0 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
1a100 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
1a110 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
1a120 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
1a130 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
1a140 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
1a150 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
1a160 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
1a170 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1a180 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
1a190 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
1a1a0 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
1a1b0 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
1a1c0 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
1a1d0 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
1a1e0 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
1a1f0 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
1a200 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
1a210 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
1a220 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
1a230 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1a240 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
1a250 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
1a260 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
1a270 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
1a280 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
1a290 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1a2a0 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
1a2b0 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
1a2c0 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
1a2d0 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
1a2e0 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
1a2f0 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
1a300 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
1a310 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
1a320 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
1a330 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
1a340 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
1a350 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
1a360 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
1a370 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
1a380 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
1a390 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
1a3a0 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
1a3b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
1a3c0 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
1a3d0 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
1a3e0 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
1a3f0 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
1a400 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
1a410 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
1a420 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
1a430 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
1a440 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
1a450 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
1a460 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
1a470 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1a480 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
1a490 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65  e isHot paramete
1a4a0 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  r indicates that
1a4b0 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
1a4c0 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75  o rollback a jou
1a4d0 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67  rnal.** that mig
1a4e0 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72  ht be a hot jour
1a4f0 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75  nal.  Or, it cou
1a500 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a  ld be that the j
1a510 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72  ournal is .** pr
1a520 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20  eserved because 
1a530 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  of JOURNALMODE_P
1a540 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41  ERSIST or JOURNA
1a550 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a  LMODE_TRUNCATE..
1a560 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
1a570 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c  l really is hot,
1a580 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72   reset the pager
1a590 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c   cache prior rol
1a5a0 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79  ling.** back any
1a5b0 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68   content.  If th
1a5c0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72  e journal is mer
1a5d0 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20  ely persistent, 
1a5e0 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e  no reset is.** n
1a5f0 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
1a600 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
1a610 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
1a620 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
1a630 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1a640 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
1a650 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  s;.  i64 szJ;   
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a670 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
1a680 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
1a690 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
1a6a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a6b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
1a6c0 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
1a6d0 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6f0 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
1a700 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1a710 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
1a720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1a730 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
1a740 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
1a750 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1a760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a770 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
1a780 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
1a790 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20    int res = 1;  
1a7a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1a7b0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1a7c0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1a7d0 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  ) */.  char *zMa
1a7e0 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
1a7f0 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
1a800 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
1a810 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  f any */.  int n
1a820 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20  eedPagerReset;  
1a830 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72      /* True to r
1a840 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20  eset page prior 
1a850 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f  to first page ro
1a860 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20  llback */..  /* 
1a870 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1a880 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
1a890 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1a8a0 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
1a8b0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1a8c0 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
1a8d0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1a8e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
1a8f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1a900 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1a910 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
1a920 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a930 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
1a940 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1a950 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
1a960 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
1a970 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
1a980 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
1a990 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
1a9a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a9b0 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
1a9c0 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
1a9d0 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
1a9e0 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
1a9f0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1aa00 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
1aa10 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
1aa20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
1aa30 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  d back..  **.  *
1aa40 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61  * TODO: Technica
1aa50 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  lly the followin
1aa60 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65  g is an error be
1aa70 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73  cause it assumes
1aa80 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65   that.  ** buffe
1aa90 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  r Pager.pTmpSpac
1aaa0 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65  e is (mxPathname
1aab0 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72  +1) bytes or lar
1aac0 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20  ger. i.e. that. 
1aad0 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67   ** (pPager->pag
1aae0 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d  eSize >= pPager-
1aaf0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1ab00 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75  e+1). Using os_u
1ab10 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50  nix.c,.  **  mxP
1ab20 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20  athname is 512, 
1ab30 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d  which is the sam
1ab40 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  e as the minimum
1ab50 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65   allowable value
1ab60 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69  .  ** for pageSi
1ab70 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74  ze..  */.  zMast
1ab80 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
1ab90 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72  pSpace;.  rc = r
1aba0 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1abb0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
1abc0 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
1abd0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1abe0 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
1abf0 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1ac00 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20  er[0] ){.    rc 
1ac10 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
1ac20 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
1ac30 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
1ac40 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
1ac50 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  }.  zMaster = 0;
1ac60 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1ac70 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a  E_OK || !res ){.
1ac80 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1ac90 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
1aca0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1acb0 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72  = 0;.  needPager
1acc0 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a  Reset = isHot;..
1acd0 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
1ace0 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
1acf0 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72   when a readJour
1ad00 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a  nalHdr() or .  *
1ad10 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
1ad20 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c  _one_page() call
1ad30 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1ad40 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
1ad50 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73  ror .  ** occurs
1ad60 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  . .  */.  while(
1ad70 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61   1 ){.    /* Rea
1ad80 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
1ad90 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
1ada0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1adb0 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
1adc0 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
1add0 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
1ade0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1adf0 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
1ae00 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
1ae10 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
1ae20 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
1ae30 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
1ae40 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
1ae50 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
1ae60 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
1ae70 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
1ae80 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
1ae90 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1aea0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
1aeb0 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a  Pager, isHot, sz
1aec0 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
1aed0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1aee0 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
1aef0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1af00 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1af10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1af20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
1af30 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1af40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1af50 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
1af60 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
1af70 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
1af80 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
1af90 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
1afa0 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
1afb0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
1afc0 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
1afd0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
1afe0 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
1aff0 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
1b000 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
1b010 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
1b020 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
1b030 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
1b040 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
1b050 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
1b060 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
1b070 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
1b080 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b090 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
1b0a0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1b0b0 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
1b0c0 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
1b0d0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1b0e0 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
1b0f0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
1b100 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1b110 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
1b120 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
1b130 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1b140 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
1b150 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
1b160 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74  and if this is t
1b170 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20  he final header 
1b180 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  in the journal, 
1b190 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20  then it means.  
1b1a0 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70    ** that this p
1b1b0 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
1b1c0 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c  al was being fil
1b1d0 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20  led but has not 
1b1e0 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  yet been.    ** 
1b1f0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
1b200 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d   Compute the num
1b210 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73  ber of pages bas
1b220 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e  ed on the remain
1b230 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20  ing.    ** size 
1b240 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  of the file..   
1b250 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74   **.    ** The t
1b260 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65  hird term of the
1b270 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20   test was added 
1b280 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32  to fix ticket #2
1b290 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e  565..    ** When
1b2a0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
1b2b0 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65  hot journal, nRe
1b2c0 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e  c==0 always mean
1b2d0 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a  s that the next.
1b2e0 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20      ** chunk of 
1b2f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  the journal cont
1b300 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20  ains zero pages 
1b310 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1b320 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77  k.  But.    ** w
1b330 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c  hen doing a ROLL
1b340 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65  BACK and the nRe
1b350 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68  c==0 chunk is th
1b360 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a  e last chunk in.
1b370 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
1b380 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  al, it means tha
1b390 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  t the journal mi
1b3a0 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69  ght contain addi
1b3b0 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61  tional.    ** pa
1b3c0 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ges that need to
1b3d0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1b3e0 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d  and that the num
1b3f0 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20  ber of pages .  
1b400 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63    ** should be c
1b410 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e  omputed based on
1b420 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b430 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
1b440 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26     if( nRec==0 &
1b450 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20  & !isHot &&.    
1b460 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1b470 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
1b480 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
1b490 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b4a0 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  f ){.      nRec 
1b4b0 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70  = (int)((szJ - p
1b4c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b4d0 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
1b4e0 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1b4f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1b500 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1b510 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
1b520 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
1b530 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
1b540 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1b550 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
1b560 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
1b570 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
1b580 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1b590 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b5a0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
1b5b0 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
1b5c0 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
1b5d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1b5e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b5f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1b600 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
1b610 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1b620 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20  ize = mxPg;.    
1b630 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  }..    /* Copy o
1b640 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
1b650 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1b660 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
1b670 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
1b680 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20  ase file and/or 
1b690 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20  page cache..    
1b6a0 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20  */.    for(u=0; 
1b6b0 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20  u<nRec; u++){.  
1b6c0 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65      if( needPage
1b6d0 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20  rReset ){.      
1b6e0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1b6f0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e  ager);.        n
1b700 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
1b710 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1b720 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
1b730 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
1b740 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f  ager,&pPager->jo
1b750 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b  urnalOff,0,1,0);
1b760 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1b770 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b780 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b790 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1b7a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b7b0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
1b7c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b7d0 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
1b7e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1b7f0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
1b800 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1b810 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1b820 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
1b830 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
1b840 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c  truncated, simpl
1b850 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61  y stop reading a
1b860 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
1b870 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a  processing the j
1b880 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67  ournal. This mig
1b890 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ht happen if the
1b8a0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
1b8b0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f         ** not co
1b8c0 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e  mpletely written
1b8d0 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f   and synced prio
1b8e0 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49  r to a crash.  I
1b8f0 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  n that.         
1b900 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61   ** case, the da
1b910 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61  tabase should ha
1b920 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ve never been wr
1b930 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20  itten in the.   
1b940 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
1b950 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f  place so it is O
1b960 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e  K to simply aban
1b970 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  don the rollback
1b980 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1b990 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b9a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1b9b0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1b9c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b9d0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72       /* If we ar
1b9e0 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  e unable to roll
1b9f0 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72  back, quit and r
1ba00 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a  eturn the error.
1ba10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64            ** cod
1ba20 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
1ba30 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f  use the pager to
1ba40 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
1ba50 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20   state.         
1ba60 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66   ** so that no f
1ba70 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c  urther harm will
1ba80 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61   be done.  Perha
1ba90 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  ps the next.    
1baa0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1bab0 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77   to come along w
1bac0 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72  ill be able to r
1bad0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61  ollback the data
1bae0 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  base..          
1baf0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
1bb00 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1bb10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bb20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
1bb30 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61  NOTREACHED*/.  a
1bb40 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64  ssert( 0 );..end
1bb50 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20  _playback:.  /* 
1bb60 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c  Following a roll
1bb70 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
1bb80 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1bb90 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72  e back in its or
1bba0 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74  iginal.  ** stat
1bbb0 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  e prior to the s
1bbc0 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
1bbd0 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f  saction, so invo
1bbe0 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ke the.  ** SQLI
1bbf0 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1bc00 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72  ANGED file-contr
1bc10 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73  ol method to dis
1bc20 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73  able the.  ** as
1bc30 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65  sertion that the
1bc40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1bc50 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65  nter was modifie
1bc60 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
1bc70 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 64  (.    pPager->fd
1bc80 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c  ->pMethods==0 ||
1bc90 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
1bca0 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
1bcb0 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54  ->fd,SQLITE_FCNT
1bcc0 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30  L_DB_UNCHANGED,0
1bcd0 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29  )>=SQLITE_OK.  )
1bce0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1bcf0 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70  playback is happ
1bd00 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61  ening automatica
1bd10 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20  lly as a result 
1bd20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a  of an IO or .  *
1bd30 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74  * malloc error t
1bd40 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74  hat occurred aft
1bd50 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  er the change-co
1bd60 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
1bd70 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f  d but .  ** befo
1bd80 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
1bd90 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
1bda0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67  , then the chang
1bdb0 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  e-counter .  ** 
1bdc0 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79  modification may
1bdd0 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   just have been 
1bde0 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69  reverted. If thi
1bdf0 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63  s happens in exc
1be00 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64  lusive .  ** mod
1be10 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
1be20 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt transactions 
1be30 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65  performed by the
1be40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
1be50 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65   not.  ** update
1be60 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1be70 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73  ter at all. This
1be80 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63   may lead to cac
1be90 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79  he inconsistency
1bea0 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66  .  ** problems f
1beb0 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  or other process
1bec0 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  es at some point
1bed0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1bee0 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e  So, just.  ** in
1bef0 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68   case this has h
1bf00 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74  appened, clear t
1bf10 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
1bf20 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a  ne flag now..  *
1bf30 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  /.  pPager->chan
1bf40 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
1bf50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
1bf60 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1bf70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73  E_OK ){.    zMas
1bf80 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1bf90 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20  mpSpace;.    rc 
1bfa0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1bfb0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1bfc0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1bfd0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1bfe0 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63  me+1);.    testc
1bff0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1c000 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1c010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1c020 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
1c030 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1c040 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
1c050 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1c060 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20  _OPEN).  ){.    
1c070 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1c080 72 53 79 6e 63 28 70 50 61 67 65 72 29 3b 0a 20  rSync(pPager);. 
1c090 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1c0a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1c0b0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
1c0c0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
1c0d0 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30   zMaster[0]!='\0
1c0e0 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ');.    testcase
1c0f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c100 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1c110 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
1c120 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20  aster[0] && res 
1c130 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
1c140 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
1c150 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
1c160 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
1c170 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
1c180 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
1c190 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
1c1a0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
1c1b0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
1c1c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
1c1d0 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
1c1e0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74   zMaster);.    t
1c1f0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1c200 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
1c210 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
1c220 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
1c230 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
1c240 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
1c250 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
1c260 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
1c270 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
1c280 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
1c290 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
1c2a0 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
1c2b0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
1c2c0 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
1c2d0 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
1c2e0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
1c2f0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
1c300 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  c;.}.../*.** Rea
1c310 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  d the content fo
1c320 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  r page pPg out o
1c330 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1c340 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a  ile and into .**
1c350 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73   pPg->pData. A s
1c360 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72  hared lock or gr
1c370 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
1c380 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
1c390 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72  se.** file befor
1c3a0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1c3b0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1c3c0 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65   If page 1 is re
1c3d0 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ad, then the val
1c3e0 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
1c3f0 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20  leVers[] is set 
1c400 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  to.** the value 
1c410 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
1c420 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1c430 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
1c440 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
1c450 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72  he IO error is r
1c460 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
1c470 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77  aller..** Otherw
1c480 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
1c490 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1c4a0 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
1c4b0 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
1c4c0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1c4d0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1c4e0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1c4f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1c500 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50   page pPg */.  P
1c510 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
1c520 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50  pgno;       /* P
1c530 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65  age number to re
1c540 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ad */.  int rc =
1c550 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1c560 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1c570 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ode */.  int isI
1c580 6e 57 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  nWal = 0;       
1c590 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1c5a0 20 70 61 67 65 20 69 73 20 69 6e 20 6c 6f 67 20   page is in log 
1c5b0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67  file */.  int pg
1c5c0 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  sz = pPager->pag
1c5d0 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72  eSize; /* Number
1c5e0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
1c5f0 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
1c600 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1c610 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
1c620 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
1c630 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1c640 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28  r->fd) );..  if(
1c650 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e 28 70   NEVER(!isOpen(p
1c660 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20  Pager->fd)) ){. 
1c670 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c680 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1c690 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
1c6a0 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
1c6b0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1c6c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c6d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  ;.  }..  if( pag
1c6e0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1c6f0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74   ){.    /* Try t
1c700 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20  o pull the page 
1c710 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61  from the write-a
1c720 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20  head log. */.   
1c730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1c740 52 65 61 64 28 70 50 61 67 65 72 2d 3e 70 57 61  Read(pPager->pWa
1c750 6c 2c 20 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61  l, pgno, &isInWa
1c760 6c 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44  l, pgsz, pPg->pD
1c770 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ata);.  }.  if( 
1c780 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c790 20 21 69 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20   !isInWal ){.   
1c7a0 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28   i64 iOffset = (
1c7b0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1c7c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1c7d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1c7e0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1c7f0 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1c800 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  sz, iOffset);.  
1c810 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c820 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1c830 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
1c840 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1c850 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f  .  }..  if( pgno
1c860 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==1 ){.    if( r
1c870 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  c ){.      /* If
1c880 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73   the read is uns
1c890 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
1c8a0 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  he dbFileVers[] 
1c8b0 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20  to something.   
1c8c0 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20     ** that will 
1c8d0 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64  never be a valid
1c8e0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20   file version.  
1c8f0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1c900 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  a copy.      ** 
1c910 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20  of bytes 24..39 
1c920 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1c930 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73    Bytes 28..31 s
1c940 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a  hould always be.
1c950 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72        ** zero or
1c960 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1c970 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
1c980 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20  e. Bytes 32..35 
1c990 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20  and 35..39.     
1c9a0 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61   ** should be pa
1c9b0 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68  ge numbers which
1c9c0 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66 66   are never 0xfff
1c9d0 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69  fffff.  So filli
1c9e0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67  ng.      ** pPag
1c9f0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d  er->dbFileVers[]
1ca00 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62   with all 0xff b
1ca10 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66  ytes should suff
1ca20 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ice..      **.  
1ca30 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e      ** For an en
1ca40 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
1ca50 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20  , the situation 
1ca60 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a  is more complex:
1ca70 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a    bytes.      **
1ca80 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1ca90 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69 74  atabase are whit
1caa0 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68  e noise.  But th
1cab0 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
1cac0 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20  .      ** white 
1cad0 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e 67  noising equaling
1cae0 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66   16 bytes of 0xf
1caf0 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79  f is vanishingly
1cb00 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20   small so.      
1cb10 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69  ** we should sti
1cb20 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20  ll be ok..      
1cb30 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  */.      memset(
1cb40 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1cb50 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66  rs, 0xff, sizeof
1cb60 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1cb70 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ers));.    }else
1cb80 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69  {.      u8 *dbFi
1cb90 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29  leVers = &((u8*)
1cba0 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b  pPg->pData)[24];
1cbb0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
1cbc0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1cbd0 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
1cbe0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1cbf0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1cc00 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  }.  }.  CODEC1(p
1cc10 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
1cc20 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d  a, pgno, 3, rc =
1cc30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
1cc40 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
1cc50 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
1cc60 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
1cc70 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1cc80 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
1cc90 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
1cca0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1ccb0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
1ccc0 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
1ccd0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1cce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ccf0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1cd00 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
1cd10 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
1cd20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1cd30 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1cd40 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1cd50 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1cd60 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39  offsets 24 and 9
1cd70 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64  2 in.** the head
1cd80 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  er and the sqlit
1cd90 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1cda0 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a   at offset 96..*
1cdb0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
1cdc0 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
1cdd0 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  date.  See also 
1cde0 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  the pager_incr_c
1cdf0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a  hangecounter().*
1ce00 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  * routine which 
1ce10 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  only updates the
1ce20 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1ce30 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73  if the update is
1ce40 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65   actually.** nee
1ce50 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e  ded, as determin
1ce60 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72  ed by the pPager
1ce70 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1ce80 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  e state variable
1ce90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1cea0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1ceb0 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72  ngecounter(PgHdr
1cec0 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68   *pPg){.  u32 ch
1ced0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20  ange_counter;.. 
1cee0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1cef0 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1cf00 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1cf10 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1cf20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1cf30 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1cf40 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e  4byte((u8*)pPg->
1cf50 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1cf60 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69  rs)+1;.  put32bi
1cf70 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1cf80 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1cf90 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1cfa0 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
1cfb0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
1cfc0 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
1cfd0 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
1cfe0 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
1cff0 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
1d000 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
1d010 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
1d020 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61  umber.  ** is va
1d030 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  lid. */.  put32b
1d040 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1d050 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
1d060 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1d070 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1d080 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c  )pPg->pData)+96,
1d090 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1d0a0 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e  NUMBER);.}..#ifn
1d0b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d0c0 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
1d0d0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1d0e0 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1d0f0 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
1d100 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
1d110 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1d120 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
1d130 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1d140 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1d150 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
1d160 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
1d170 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
1d180 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
1d190 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
1d1a0 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
1d1b0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1d1c0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
1d1d0 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
1d1e0 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
1d1f0 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
1d200 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1d210 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
1d220 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
1d230 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
1d240 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
1d250 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
1d260 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
1d270 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
1d280 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
1d290 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
1d2a0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
1d2b0 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
1d2c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1d2d0 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
1d2e0 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
1d2f0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1d300 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
1d310 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
1d320 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
1d330 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
1d340 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
1d350 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1d360 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1d370 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1d380 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
1d390 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d  r *pPg;..  pPg =
1d3a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
1d3b0 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29  kup(pPager, iPg)
1d3c0 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
1d3d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
1d3e0 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
1d3f0 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20  (pPg)==1 ){.    
1d400 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
1d410 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  rop(pPg);.    }e
1d420 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1d430 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
1d440 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1d450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d460 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
1d470 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
1d480 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1d490 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1d4a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1d4b0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1d4c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1d4d0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79  rolled back, any
1d4e0 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
1d4f0 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74  s are.  ** updat
1d500 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f  ed as data is co
1d510 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
1d520 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1d530 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20   and into the.  
1d540 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
1d550 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c  s is not general
1d560 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
1d570 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
1d580 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   as.  ** rollbac
1d590 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c  k involves simpl
1d5a0 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65  y truncating the
1d5b0 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65   log file. There
1d5c0 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a  fore, if one.  *
1d5d0 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73  * or more frames
1d5e0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1d5f0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1d600 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65  e log (and there
1d610 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20  fore .  ** also 
1d620 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
1d630 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73  backup databases
1d640 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  ) as part of thi
1d650 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  s transaction,. 
1d660 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20   ** the backups 
1d670 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65  must be restarte
1d680 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
1d690 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
1d6a0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
1d6b0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1d6c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1d6d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1d6e0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72  to rollback a tr
1d6f0 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57  ansaction on a W
1d700 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  AL database..*/.
1d710 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1d720 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65  RollbackWal(Page
1d730 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1d740 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d760 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
1d770 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20    PgHdr *pList; 
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d790 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72    /* List of dir
1d7a0 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65  ty pages to reve
1d7b0 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20  rt */..  /* For 
1d7c0 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
1d7d0 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20   cache that are 
1d7e0 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
1d7f0 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  or have already.
1d800 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65    ** been writte
1d810 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69  n (but not commi
1d820 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67  tted) to the log
1d830 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66   file, do one of
1d840 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f   the .  ** follo
1d850 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
1d860 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20    + Discard the 
1d870 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20  cached page (if 
1d880 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72  refcount==0), or
1d890 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64  .  **   + Reload
1d8a0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72   page content fr
1d8b0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1d8c0 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e  (if refcount>0).
1d8d0 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1d8e0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
1d8f0 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  >dbOrigSize;.  r
1d900 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e  c = sqlite3WalUn
1d910 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
1d920 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1d930 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  ck, (void *)pPag
1d940 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  er);.  pList = s
1d950 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1d960 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1d970 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28  Cache);.  while(
1d980 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
1d990 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
1d9a0 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
1d9b0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
1d9c0 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
1d9d0 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
1d9e0 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
1d9f0 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
1da00 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
1da10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1da20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1da30 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
1da40 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
1da50 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
1da60 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
1da70 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1da80 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
1da90 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
1daa0 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
1dab0 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
1dac0 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
1dad0 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
1dae0 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
1daf0 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
1db00 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
1db10 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f  **.** The list o
1db20 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20 69  f pages passed i
1db30 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
1db40 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65   is always sorte
1db50 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  d by page number
1db60 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70  ..** Hence, if p
1db70 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61 6e  age 1 appears an
1db80 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69  ywhere on the li
1db90 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74  st, it will be t
1dba0 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a  he first page..*
1dbb0 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
1dbc0 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
1dbd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbf0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1dc00 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1dc10 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1dc20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1dc30 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
1dc40 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
1dc50 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1dc60 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1dc70 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
1dc80 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
1dc90 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20 20  sCommit,        
1dca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1dcb0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1dcc0 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
1dcd0 73 79 6e 63 46 6c 61 67 73 20 20 20 20 20 20 20  syncFlags       
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1dcf0 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
1dd00 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30 29 20  OsSync() (or 0) 
1dd10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1dd40 6e 20 63 6f 64 65 20 2a 2f 0a 23 69 66 20 64 65  n code */.#if de
1dd50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
1dd60 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
1dd70 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1dd80 53 29 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20  S).  PgHdr *p;  
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dda0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1ddb0 69 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20 2a  ing over pages *
1ddc0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
1ddd0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
1dde0 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
1ddf0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
1de00 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
1de10 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63  e list is in acc
1de20 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
1de30 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1de40 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70   && p->pDirty; p
1de50 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1de60 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f   assert( p->pgno
1de70 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67   < p->pDirty->pg
1de80 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  no );.  }.#endif
1de90 0a 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74  ..  if( isCommit
1dea0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
1deb0 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1dec0 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
1ded0 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ed, there is no 
1dee0 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67  point in writing
1def0 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65  .    ** any page
1df00 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
1df10 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
1df20 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20   nTruncate into 
1df30 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20  the WAL file..  
1df40 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e    ** They will n
1df50 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20  ever be read by 
1df60 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72  any client. So r
1df70 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
1df80 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a  the pDirty.    *
1df90 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a  * list here. */.
1dfa0 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
1dfb0 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74    PgHdr **ppNext
1dfc0 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 66   = &pList;.    f
1dfd0 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70  or(p=pList; (*pp
1dfe0 4e 65 78 74 20 3d 20 70 29 3b 20 70 3d 70 2d 3e  Next = p); p=p->
1dff0 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69  pDirty){.      i
1e000 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75  f( p->pgno<=nTru
1e010 6e 63 61 74 65 20 29 20 70 70 4e 65 78 74 20 3d  ncate ) ppNext =
1e020 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   &p->pDirty;.   
1e030 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1e040 4c 69 73 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  List );.  }..  i
1e050 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d  f( pList->pgno==
1e060 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f  1 ) pager_write_
1e070 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c  changecounter(pL
1e080 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ist);.  rc = sql
1e090 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50  ite3WalFrames(pP
1e0a0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20  ager->pWal, .   
1e0b0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
1e0c0 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75  ize, pList, nTru
1e0d0 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c  ncate, isCommit,
1e0e0 20 73 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a   syncFlags.  );.
1e0f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e100 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70  _OK && pPager->p
1e110 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50 67  Backup ){.    Pg
1e120 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
1e130 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1e140 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1e150 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
1e160 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
1e170 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75  kup, p->pgno, (u
1e180 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20  8 *)p->pData);. 
1e190 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
1e1a0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1e1b0 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  GES.  pList = sq
1e1c0 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
1e1d0 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
1e1e0 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ache);.  for(p=p
1e1f0 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
1e200 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72  irty){.    pager
1e210 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29  _set_pagehash(p)
1e220 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1e230 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e240 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64  .** Begin a read
1e250 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1e260 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54  the WAL..**.** T
1e270 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64  his routine used
1e280 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70   to be called "p
1e290 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74  agerOpenSnapshot
1e2a0 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65  ()" because it e
1e2b0 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61  ssentially.** ma
1e2c0 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f  kes a snapshot o
1e2d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1e2e0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  t the current po
1e2f0 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20  int in time and 
1e300 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61  preserves.** tha
1e310 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75  t snapshot for u
1e320 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72  se by the reader
1e330 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e   in spite of con
1e340 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65  currently change
1e350 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72  s by.** other wr
1e360 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f  iters or checkpo
1e370 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  inters..*/.stati
1e380 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e  c int pagerBegin
1e390 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1e3a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1e3b0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1e3e0 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65   */.  int change
1e3f0 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
1e400 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e410 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72   cache must be r
1e420 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eset */..  asser
1e430 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1e440 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
1e450 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1e460 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
1e470 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1e480 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
1e490 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57  ;..  /* sqlite3W
1e4a0 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
1e4b0 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63  tion() was not c
1e4c0 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72  alled for the pr
1e4d0 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e  evious.  ** tran
1e4e0 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69  saction in locki
1e4f0 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
1e500 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e  E.  So call it n
1e510 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20  ow.  If we.  ** 
1e520 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  are in locking_m
1e530 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45  ode=NORMAL and E
1e540 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65  ndRead() was pre
1e550 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a  viously called,.
1e560 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61    ** the duplica
1e570 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c  te call is harml
1e580 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
1e590 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1e5a0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
1e5b0 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20  >pWal);..  rc = 
1e5c0 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52  sqlite3WalBeginR
1e5d0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
1e5e0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68  Pager->pWal, &ch
1e5f0 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63  anged);.  if( rc
1e600 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63  !=SQLITE_OK || c
1e610 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61  hanged ){.    pa
1e620 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1e630 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1e640 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
1e650 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e660 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  on is called as 
1e670 70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  part of the tran
1e680 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45  sition from PAGE
1e690 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47  R_OPEN.** to PAG
1e6a0 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20  ER_READER state 
1e6b0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1e6c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1e6d0 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e  abase file.** in
1e6e0 20 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67   pages (assuming
1e6f0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63   the page size c
1e700 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
1e710 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  in Pager.pageSiz
1e720 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  e)..**.** If no 
1e730 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
1e740 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1e750 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65  ned and the size
1e760 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e770 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20  .** in pages is 
1e780 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67  stored in *pnPag
1e790 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  e. Otherwise, an
1e7a0 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72   error code (per
1e7b0 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49  haps.** SQLITE_I
1e7c0 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73 20 72  OERR_FSTAT) is r
1e7d0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50  eturned and *pnP
1e7e0 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  age is left unmo
1e7f0 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  dified..*/.stati
1e800 63 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63  c int pagerPagec
1e810 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
1e820 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65  er, Pgno *pnPage
1e830 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  ){.  Pgno nPage;
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e850 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
1e860 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50   return via *pnP
1e870 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65  age */..  /* Que
1e880 72 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  ry the WAL sub-s
1e890 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61  ystem for the da
1e8a0 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65  tabase size. The
1e8b0 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a   WalDbsize().  *
1e8c0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
1e8d0 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57  ns zero if the W
1e8e0 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28  AL is not open (
1e8f0 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d  i.e. Pager.pWal=
1e900 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20  =0), or.  ** if 
1e910 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1e920 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
1e930 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  le. The database
1e940 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a   size is not.  *
1e950 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  * available from
1e960 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1e970 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66  tem if the log f
1e980 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a  ile is empty or.
1e990 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
1e9a0 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64   valid committed
1e9b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20   transactions.. 
1e9c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1e9d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1e9e0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
1e9f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
1ea00 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
1ea10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65   || pPager->noRe
1ea20 61 64 6c 6f 63 6b 20 29 3b 0a 20 20 6e 50 61 67  adlock );.  nPag
1ea30 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62  e = sqlite3WalDb
1ea40 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61  size(pPager->pWa
1ea50 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  l);..  /* If the
1ea60 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
1ea70 61 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  as not available
1ea80 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75   from the WAL su
1ea90 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64  b-system,.  ** d
1eaa0 65 74 65 72 6d 69 6e 65 20 69 74 20 62 61 73 65  etermine it base
1eab0 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  d on the size of
1eac0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ead0 6c 65 2e 20 49 66 20 74 68 65 20 73 69 7a 65 0a  le. If the size.
1eae0 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61    ** of the data
1eaf0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
1eb00 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74   an integer mult
1eb10 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65  iple of the page
1eb20 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e  -size,.  ** roun
1eb30 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65  d down to the ne
1eb40 61 72 65 73 74 20 70 61 67 65 2e 20 45 78 63 65  arest page. Exce
1eb50 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c 61 72  pt, any file lar
1eb60 67 65 72 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20  ger than 0.  ** 
1eb70 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 69 73  bytes in size is
1eb80 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 63   considered to c
1eb90 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20  ontain at least 
1eba0 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  one page..  */. 
1ebb0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
1ebc0 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20  .    i64 n = 0; 
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
1ebf0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1ec00 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
1ec10 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1ec20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1ec30 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
1ec40 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1ec50 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  d) ){.      int 
1ec60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1ec70 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1ec80 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66  d, &n);.      if
1ec90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1eca0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1ecb0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1ecc0 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20    }.    nPage = 
1ecd0 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65  (Pgno)(n / pPage
1ece0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1ecf0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26    if( nPage==0 &
1ed00 26 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e  & n>0 ){.      n
1ed10 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Page = 1;.    }.
1ed20 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1ed30 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   current number 
1ed40 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1ed50 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20  file is greater 
1ed60 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f  than the.  ** co
1ed70 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d  nfigured maximum
1ed80 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69   pager number, i
1ed90 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f  ncrease the allo
1eda0 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a  wed limit so.  *
1edb0 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  * that the file 
1edc0 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a  can be read..  *
1edd0 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50  /.  if( nPage>pP
1ede0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
1edf0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
1ee00 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65  no = (Pgno)nPage
1ee10 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65  ;.  }..  *pnPage
1ee20 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
1ee30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1ee40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ee50 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43  OMIT_WAL./*.** C
1ee60 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61  heck if the *-wa
1ee70 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72  l file that corr
1ee80 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64  esponds to the d
1ee90 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
1eea0 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73  y pPager.** exis
1eeb0 74 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ts if the databa
1eec0 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20  se is not empy, 
1eed0 6f 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74  or verify that t
1eee0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f  he *-wal file do
1eef0 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20  es.** not exist 
1ef00 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29  (by deleting it)
1ef10 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1ef20 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a   file is empty..
1ef30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
1ef40 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
1ef50 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c  ty and the *-wal
1ef60 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70   file exists, op
1ef70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  en the pager.** 
1ef80 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66  in WAL mode.  If
1ef90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1efa0 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20   empty or if no 
1efb0 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
1efc0 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65  s and.** if no e
1efd0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b  rror occurs, mak
1efe0 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75  e sure Pager.jou
1eff0 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20  rnalMode is not 
1f000 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  set to.** PAGER_
1f010 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e  JOURNALMODE_WAL.
1f020 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1f030 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72  LITE_OK or an er
1f040 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1f050 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1f060 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f  hold a SHARED lo
1f070 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1f080 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20  se file to call 
1f090 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1f0a0 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43  . Because an EXC
1f0b0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1f0c0 68 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65  he db file is re
1f0d0 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65  quired to delete
1f0e0 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20   .** a WAL on a 
1f0f0 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62  none-empty datab
1f100 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  ase, this ensure
1f110 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61  s there is no ra
1f120 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a  ce condition .**
1f130 20 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63   between the xAc
1f140 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64  cess() below and
1f150 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65   an xDelete() be
1f160 69 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20  ing executed by 
1f170 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63  some .** other c
1f180 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
1f190 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
1f1a0 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50  enWalIfPresent(P
1f1b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1f1c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f1d0 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
1f1e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1f1f0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61  AGER_OPEN );.  a
1f200 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1f210 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
1f220 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 52  K || pPager->noR
1f230 65 61 64 6c 6f 63 6b 20 29 3b 0a 0a 20 20 69 66  eadlock );..  if
1f240 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
1f250 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ile ){.    int i
1f260 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  sWal;           
1f270 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1f280 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69   if WAL file exi
1f290 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  sts */.    Pgno 
1f2a0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1f2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1f2c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f2d0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63   file */..    rc
1f2e0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
1f2f0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
1f300 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1f310 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
1f320 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
1f330 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f340 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
1f350 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
1f360 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zWal, 0);.      
1f370 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  isWal = 0;.    }
1f380 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1f390 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1f3a0 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  (.          pPag
1f3b0 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
1f3c0 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ->zWal, SQLITE_A
1f3d0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69  CCESS_EXISTS, &i
1f3e0 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20  sWal.      );.  
1f3f0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1f400 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f410 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a     if( isWal ){.
1f420 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f430 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  ( sqlite3PcacheP
1f440 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
1f450 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
1f460 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f470 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
1f480 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
1f490 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
1f4a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1f4b0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
1f4c0 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  ODE_WAL ){.     
1f4d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1f4e0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
1f4f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
1f500 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1f510 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1f520 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1f530 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70  * Playback savep
1f540 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e  oint pSavepoint.
1f550 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69   Or, if pSavepoi
1f560 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70  nt==NULL, then p
1f570 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65  layback.** the e
1f580 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
1f590 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63  rnal file. The c
1f5a0 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d  ase pSavepoint==
1f5b0 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e  NULL occurs when
1f5c0 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20   .** a ROLLBACK 
1f5d0 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e  TO command is in
1f5e0 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50  voked on a SAVEP
1f5f0 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74  OINT that is a t
1f600 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73  ransaction .** s
1f610 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
1f620 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20  When pSavepoint 
1f630 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61  is not NULL (mea
1f640 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73  ning a non-trans
1f650 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
1f660 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f   is .** being ro
1f670 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e  lled back), then
1f680 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f   the rollback co
1f690 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20  nsists of up to 
1f6a0 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a  three stages,.**
1f6b0 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68   performed in th
1f6c0 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65  e order specifie
1f6d0 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  d:.**.**   * Pag
1f6e0 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  es are played ba
1f6f0 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
1f700 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
1f710 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  g at byte.**    
1f720 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76   offset PagerSav
1f730 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
1f740 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
1f750 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
1f760 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
1f770 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e  et, or to the en
1f780 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
1f790 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
1f7a0 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f  e if PagerSavepo
1f7b0 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
1f7c0 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20  s zero..**.**   
1f7d0 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f  * If PagerSavepo
1f7e0 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
1f7f0 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
1f800 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   pages are playe
1f810 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74  d.**     back st
1f820 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  arting from the 
1f830 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
1f840 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
1f850 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67  wing .**     Pag
1f860 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1f870 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e  Offset to the en
1f880 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
1f890 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
1f8a0 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
1f8b0 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  then played back
1f8c0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
1f8d0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72  urnal file, star
1f8e0 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68  ting.**     with
1f8f0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
1f900 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20  int.iSubRec and 
1f910 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
1f920 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20  e end of.**     
1f930 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1f940 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f  ..**.** Througho
1f950 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ut the rollback 
1f960 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69  process, each ti
1f970 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c  me a page is rol
1f980 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a  led back, the.**
1f990 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
1f9a0 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62  it is set in a b
1f9b0 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
1f9c0 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20  (variable pDone 
1f9d0 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d  in the.** implem
1f9e0 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e  entation below).
1f9f0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
1fa00 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70   ensure that a p
1fa10 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72  age is only.** r
1fa20 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66  olled back the f
1fa30 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20  irst time it is 
1fa40 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65  encountered in e
1fa50 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ither journal..*
1fa60 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69  *.** If pSavepoi
1fa70 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
1fa80 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20   pages are only 
1fa90 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
1faa0 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
1fab0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
1fac0 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
1fad0 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73  a bitvec in this
1fae0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   case..**.** In 
1faf0 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66  either case, bef
1fb00 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d  ore playback com
1fb10 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72  mences the Pager
1fb20 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65  .dbSize variable
1fb30 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20  .** is reset to 
1fb40 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69  the value that i
1fb50 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74  t held at the st
1fb60 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70  art of the savep
1fb70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61  oint .** (or tra
1fb80 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61  nsaction). No pa
1fb90 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e  ge with a page-n
1fba0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
1fbb0 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  an this value.**
1fbc0 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   is played back.
1fbd0 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75   If one is encou
1fbe0 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d  ntered it is sim
1fbf0 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  ply skipped..*/.
1fc00 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1fc10 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
1fc20 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
1fc30 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
1fc40 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20  *pSavepoint){.  
1fc50 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
1fc60 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65           /* Effe
1fc70 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
1fc80 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  e main journal *
1fc90 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fcb0 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67  End of first seg
1fcc0 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75  ment of main-jou
1fcd0 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a  rnal records */.
1fce0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1fcf0 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
1fd00 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
1fd10 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30  itvec *pDone = 0
1fd20 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65  ;       /* Bitve
1fd30 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65  c to ensure page
1fd40 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e  s played back on
1fd50 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73  ly once */..  as
1fd60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1fd70 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
1fd80 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
1fd90 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1fda0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
1fdb0 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ED );..  /* Allo
1fdc0 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f  cate a bitvec to
1fdd0 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68   use to store th
1fde0 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72  e set of pages r
1fdf0 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  olled back */.  
1fe00 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
1fe10 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71  {.    pDone = sq
1fe20 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
1fe30 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  e(pSavepoint->nO
1fe40 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70  rig);.    if( !p
1fe50 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Done ){.      re
1fe60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1fe70 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  M;.    }.  }..  
1fe80 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62  /* Set the datab
1fe90 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f  ase size back to
1fea0 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61   the value it wa
1feb0 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76  s before the sav
1fec0 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69  epoint .  ** bei
1fed0 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20  ng reverted was 
1fee0 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
1fef0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1ff00 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61  pSavepoint ? pSa
1ff10 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a  vepoint->nOrig :
1ff20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1ff30 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  ize;.  pPager->c
1ff40 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1ff50 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1ff60 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65  e;..  if( !pSave
1ff70 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73  point && pagerUs
1ff80 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
1ff90 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
1ffa0 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67  RollbackWal(pPag
1ffb0 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  er);.  }..  /* U
1ffc0 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  se pPager->journ
1ffd0 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66  alOff as the eff
1ffe0 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
1fff0 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
20000 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
20010 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  The actual file 
20020 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
20030 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a  than this in.  *
20040 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
20050 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20  ODE_TRUNCATE or 
20060 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20070 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20  E_PERSIST.  But 
20080 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61  anything.  ** pa
20090 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  st pPager->journ
200a0 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d  alOff is off-lim
200b0 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a  its to us..  */.
200c0 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
200d0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73  journalOff;.  as
200e0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
200f0 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
20100 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  szJ==0 );..  /* 
20110 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67  Begin by rolling
20120 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72   back records fr
20130 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
20140 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
20150 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
20160 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
20170 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
20180 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
20190 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72  eader..  ** Ther
201a0 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72  e might be recor
201b0 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ds in the main j
201c0 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65  ournal that have
201d0 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20   a page number. 
201e0 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e   ** greater than
201f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
20200 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67  abase size (pPag
20210 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20  er->dbSize) but 
20220 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  those.  ** will 
20230 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d  be skipped autom
20240 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73  atically.  Pages
20250 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44   are added to pD
20260 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a  one as they.  **
20270 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
20280 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
20290 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65  vepoint && !page
202a0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
202b0 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d  ){.    iHdrOff =
202c0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
202d0 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70  rOffset ? pSavep
202e0 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
202f0 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67   : szJ;.    pPag
20300 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
20310 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66   pSavepoint->iOf
20320 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  fset;.    while(
20330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
20340 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
20350 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a  lOff<iHdrOff ){.
20360 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
20370 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
20380 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
20390 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
203a0 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
203b0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
203c0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
203d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
203e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
203f0 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ff = 0;.  }..  /
20400 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69  * Continue rolli
20410 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
20420 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
20430 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
20440 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   at.  ** the fir
20450 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
20460 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69  r seen and conti
20470 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20  nuing until the 
20480 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20  effective end.  
20490 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** of the main j
204a0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f  ournal file.  Co
204b0 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f  ntinue to skip o
204c0 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
204d0 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69  s and.  ** conti
204e0 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73  nue adding pages
204f0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
20500 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68  pDone..  */.  wh
20510 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
20520 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
20530 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a  urnalOff<szJ ){.
20540 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
20550 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
20560 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33  ounter */.    u3
20570 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
20580 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
20590 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
205a0 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
205b0 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
205c0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
205d0 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  0, szJ, &nJRec, 
205e0 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73  &dummy);.    ass
205f0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
20600 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  DONE );..    /*.
20610 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67      ** The "pPag
20620 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
20630 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
20640 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
20650 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a  ournalOff".    *
20660 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65  * test is relate
20670 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36  d to ticket #256
20680 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63  5.  See the disc
20690 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ussion in the.  
206a0 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
206b0 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ack() function f
206c0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
206d0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
206e0 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  /.    if( nJRec=
206f0 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  =0 .     && pPag
20700 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
20710 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
20720 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
20730 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b  ournalOff.    ){
20740 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
20750 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  u32)((szJ - pPag
20760 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f  er->journalOff)/
20770 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
20780 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
20790 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d    for(ii=0; rc==
207a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
207b0 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d  nJRec && pPager-
207c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b  >journalOff<szJ;
207d0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63   ii++){.      rc
207e0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
207f0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
20800 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
20810 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
20820 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
20830 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
20840 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20  TE_DONE );.  }. 
20850 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
20860 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
20870 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a  ->journalOff>=sz
20880 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  J );..  /* Final
20890 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61  ly,  rollback pa
208a0 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ges from the sub
208b0 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20  -journal.  Page 
208c0 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70  that were.  ** p
208d0 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64  reviously rolled
208e0 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65   back out of the
208f0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61   main journal (a
20900 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20  nd are hence in 
20910 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c  pDone).  ** will
20920 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75   be skipped.  Ou
20930 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
20940 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65   are also skippe
20950 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  d..  */.  if( pS
20960 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
20970 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
20980 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
20990 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66  er */.    i64 of
209a0 66 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e  fset = pSavepoin
209b0 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50  t->iSubRec*(4+pP
209c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
209d0 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
209e0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
209f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20a00 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55  te3WalSavepointU
20a10 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
20a20 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57  , pSavepoint->aW
20a30 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  alData);.    }. 
20a40 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70     for(ii=pSavep
20a50 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72  oint->iSubRec; r
20a60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20a70 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  ii<pPager->nSubR
20a80 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ec; ii++){.     
20a90 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d   assert( offset=
20aa0 3d 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  =ii*(4+pPager->p
20ab0 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20  ageSize) );.    
20ac0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
20ad0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
20ae0 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20  Pager, &offset, 
20af0 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20  pDone, 0, 1);.  
20b00 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
20b10 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
20b20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
20b30 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
20b40 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Done);.  if( rc=
20b50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20b60 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20b70 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a  lOff = szJ;.  }.
20b80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20b90 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
20ba0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
20bb0 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
20bc0 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
20bd0 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
20be0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
20bf0 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
20c00 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
20c10 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
20c20 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  heSetCachesize(p
20c30 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
20c40 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mxPage);.}../*.*
20c50 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
20c60 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
20c70 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
20c80 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
20c90 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
20ca0 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
20cb0 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
20cc0 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
20cd0 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
20ce0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
20cf0 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
20d00 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
20d10 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
20d20 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
20d30 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
20d40 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
20d50 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
20d60 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
20d70 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
20d80 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
20d90 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
20da0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
20db0 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
20dc0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
20dd0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20de0 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
20df0 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
20e00 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
20e10 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
20e20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
20e30 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
20e40 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
20e50 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
20e60 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
20e70 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
20e80 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
20e90 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
20ea0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
20eb0 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
20ec0 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
20ed0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
20ee0 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
20ef0 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
20f00 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
20f10 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
20f20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
20f30 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
20f40 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
20f50 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
20f60 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
20f70 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
20f80 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
20f90 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
20fa0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
20fb0 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
20fc0 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
20fd0 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
20fe0 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
21000 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
21010 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
21020 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
21030 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
21040 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
21050 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
21060 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
21070 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
21080 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
21090 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
210a0 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
210b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
210c0 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
210d0 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
210e0 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
210f0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
21100 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20  he above is for 
21110 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  a rollback-journ
21120 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41  al mode.  For WA
21130 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74  L mode, OFF cont
21140 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e  inues.** to mean
21150 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65   that no syncs e
21160 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d  ver occur.  NORM
21170 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  AL means that th
21180 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a  e WAL is synced.
21190 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ** prior to the 
211a0 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f  start of checkpo
211b0 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65  int and that the
211c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
211d0 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74  s synced.** at t
211e0 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
211f0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
21200 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  if the entire co
21210 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c  ntent of the WAL
21220 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20  .** was written 
21230 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
21240 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20  tabase.  But no 
21250 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20  sync operations 
21260 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20  occur for.** an 
21270 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20  ordinary commit 
21280 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77  in NORMAL mode w
21290 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d  ith WAL.  FULL m
212a0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
212b0 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e  L.** file is syn
212c0 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ced following ea
212d0 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74  ch commit operat
212e0 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e  ion, in addition
212f0 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73   to the.** syncs
21300 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21310 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44   NORMAL..**.** D
21320 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79  o not confuse sy
21330 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77  nchronous=FULL w
21340 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ith SQLITE_SYNC_
21350 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  FULL.  The.** SQ
21360 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d  LITE_SYNC_FULL m
21370 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73  acro means to us
21380 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79  e the MacOSX-sty
21390 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a  le full-fsync.**
213a0 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46   using fcntl(F_F
213b0 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49  ULLFSYNC).  SQLI
213c0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d  TE_SYNC_NORMAL m
213d0 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a  eans to do an.**
213e0 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28   ordinary fsync(
213f0 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69  ) call.  There i
21400 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
21410 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53  between SQLITE_S
21420 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20  YNC_FULL.** and 
21430 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
21440 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20  AL on platforms 
21450 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53  other than MacOS
21460 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73  X.  But the.** s
21470 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
21480 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f  versus synchrono
21490 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e  us=NORMAL settin
214a0 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  g determines whe
214b0 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70  n.** the xSync p
214c0 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c  rimitive is call
214d0 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61  ed and is releva
214e0 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f  nt to all platfo
214f0 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  rms..**.** Numer
21500 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
21510 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
21520 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
21530 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
21540 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
21550 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21560 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
21570 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21580 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
21590 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
215a0 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
215b0 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73 61   pager to set sa
215c0 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a  fety level for *
215d0 2f 0a 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20  /.  int level,  
215e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41            /* PRA
215f0 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e  GMA synchronous.
21600 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41    1=OFF, 2=NORMA
21610 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 20 20 0a 20  L, 3=FULL */  . 
21620 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 2c   int bFullFsync,
21630 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41         /* PRAGMA
21640 20 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 20 20   fullfsync */.  
21650 69 6e 74 20 62 43 6b 70 74 46 75 6c 6c 46 73 79  int bCkptFullFsy
21660 6e 63 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20  nc    /* PRAGMA 
21670 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66  checkpoint_fullf
21680 73 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  sync */.){.  ass
21690 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26  ert( level>=1 &&
216a0 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 70   level<=3 );.  p
216b0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
216c0 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50   (level==1 || pP
216d0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
216e0 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?1:0;.  pPager->
216f0 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65  fullSync = (leve
21700 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
21710 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
21720 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
21730 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  oSync ){.    pPa
21740 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
21750 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
21760 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
21770 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62  0;.  }else if( b
21780 46 75 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20  FullFsync ){.   
21790 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
217a0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
217b0 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65  _FULL;.    pPage
217c0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
217d0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
217e0 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ULL;.  }else if(
217f0 20 62 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63 20   bCkptFullFsync 
21800 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
21810 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
21820 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
21830 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
21840 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
21850 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
21860 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
21870 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
21880 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
21890 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
218a0 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
218b0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
218c0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
218d0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
218e0 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
218f0 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
21900 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
21910 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
21920 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
21930 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
21940 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
21950 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
21960 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
21970 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
21980 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
21990 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
219a0 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
219b0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
219c0 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
219d0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69   file..**.** Wri
219e0 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
219f0 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69  riptor into *pFi
21a00 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  le. Return SQLIT
21a10 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
21a20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
21a30 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
21a40 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
21a50 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
21a60 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  ly .** delete th
21a70 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
21a80 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
21a90 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
21aa0 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  ags passed to th
21ab0 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65  e VFS layer xOpe
21ac0 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f  n() call are tho
21ad0 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  se specified.** 
21ae0 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73  by parameter vfs
21af0 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20  Flags ORed with 
21b00 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
21b10 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
21b20 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a  OPEN_READWRITE.*
21b30 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
21b40 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20  N_CREATE.**     
21b50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
21b60 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c  USIVE.**     SQL
21b70 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
21b80 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63  NCLOSE.*/.static
21b90 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65   int pagerOpente
21ba0 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  mp(.  Pager *pPa
21bb0 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
21bc0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
21bd0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
21be0 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
21bf0 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
21c00 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
21c10 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
21c20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
21c30 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
21c40 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
21c50 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
21c60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
21c70 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64  rn code */..#ifd
21c80 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
21c90 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
21ca0 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
21cb0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
21cc0 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
21cd0 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76  y */.#endif..  v
21ce0 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49  fsFlags |=  SQLI
21cf0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
21d00 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
21d10 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
21d20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
21d30 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
21d40 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
21d50 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
21d60 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
21d70 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
21d80 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
21d90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
21da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
21db0 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20  Open(pFile) );. 
21dc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21dd0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
21de0 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
21df0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  on..**.** The pa
21e00 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ger invokes the 
21e10 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20  busy-handler if 
21e20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
21e30 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
21e40 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79  TE_BUSY when try
21e50 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
21e60 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61  rom no-lock to a
21e70 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a   SHARED lock,.**
21e80 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20   or when trying 
21e90 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
21ea0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
21eb0 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
21ec0 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65  .** lock. It doe
21ed0 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74  s *not* invoke t
21ee0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
21ef0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
21f00 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f  rom.** SHARED to
21f10 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68   RESERVED, or wh
21f20 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
21f30 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c  m SHARED to EXCL
21f40 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20  USIVE.** (which 
21f50 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f  occurs during ho
21f60 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
21f70 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a  ck). Summary:.**
21f80 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e  .**   Transition
21f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fa0 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65          | Invoke
21fb0 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a  s xBusyHandler.*
21fc0 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
21fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
22000 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20    NO_LOCK       
22010 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  -> SHARED_LOCK  
22020 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53      | Yes.**   S
22030 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
22040 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
22050 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45   | No.**   SHARE
22060 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c  D_LOCK   -> EXCL
22070 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e  USIVE_LOCK   | N
22080 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f  o.**   RESERVED_
22090 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56  LOCK -> EXCLUSIV
220a0 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a  E_LOCK   | Yes.*
220b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79  *.** If the busy
220c0 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
220d0 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
220e0 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
220f0 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20  .** retried. If 
22100 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c  it returns zero,
22110 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   then the SQLITE
22120 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a  _BUSY error is.*
22130 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  * returned to th
22140 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20  e caller of the 
22150 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
22160 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
22170 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
22180 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
22190 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
221b0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
221c0 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
221d0 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
221e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
221f0 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64  ter to busy-hand
22200 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ler function */.
22210 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
22220 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20  dlerArg         
22230 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
22240 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  nt to pass to xB
22250 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b  usyHandler */.){
22260 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75    .  pPager->xBu
22270 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
22280 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
22290 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
222a0 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
222b0 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erArg;.}../*.** 
222c0 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
222d0 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
222e0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54   Pager object. T
222f0 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
22300 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69   .** is passed i
22310 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  n *pPageSize..**
22320 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
22330 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
22340 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
22350 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
22360 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20  led, it.** is a 
22370 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65  no-op. The value
22380 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
22390 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
223a0 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a  or code (i.e. .*
223b0 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  * one of SQLITE_
223c0 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45  IOERR, an SQLITE
223d0 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63  _IOERR_xxx sub-c
223e0 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ode or SQLITE_FU
223f0 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  LL)..**.** Other
22400 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20  wise, if all of 
22410 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
22420 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
22430 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73  * the new page s
22440 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70  ize (value of *p
22450 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c  PageSize) is val
22460 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20  id (a power .** 
22470 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65      of two betwe
22480 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54  en 512 and SQLIT
22490 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
224a0 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64   inclusive), and
224b0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65  .**.**   * there
224c0 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
224d0 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
224e0 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ces, and.**.**  
224f0 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
22500 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e  is either not an
22510 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
22520 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20  ase or it is.** 
22530 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79      an in-memory
22540 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
22550 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74  urrently consist
22560 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e  s of zero pages.
22570 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
22580 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67  pager object pag
22590 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
225a0 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
225b0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
225c0 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ize is changed, 
225d0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
225e0 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50  on uses sqlite3P
225f0 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a  agerMalloc() .**
22600 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77   to obtain a new
22610 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
22620 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73   buffer. If this
22630 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
22640 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  mpt .** fails, S
22650 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
22660 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
22670 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e  page size remain
22680 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  s unchanged. .**
22690 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61   In all other ca
226a0 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ses, SQLITE_OK i
226b0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
226c0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
226d0 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  ze is not change
226e0 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  d, either becaus
226f0 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75  e one of the enu
22700 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69  merated.** condi
22710 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e  tions above is n
22720 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67  ot true, the pag
22730 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20  er was in error 
22740 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
22750 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
22760 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75  called, or becau
22770 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
22780 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
22790 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65   failed, .** the
227a0 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20  n *pPageSize is 
227b0 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20  set to the old, 
227c0 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69  retained page si
227d0 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ze before return
227e0 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
227f0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
22800 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
22810 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a  r, u32 *pPageSiz
22820 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
22830 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
22840 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74  ITE_OK;..  /* It
22850 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
22860 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73   to do a full as
22870 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
22880 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73  () here, as this
22890 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d  .  ** function m
228a0 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  ay be called fro
228b0 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70  m within PagerOp
228c0 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65  en(), before the
228d0 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74   state.  ** of t
228e0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
228f0 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f  is internally co
22900 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20  nsistent..  **. 
22910 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   ** At one point
22920 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
22930 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
22940 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61   if the pager wa
22950 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52  s in .  ** PAGER
22960 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75  _ERROR state. Bu
22970 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52  t since PAGER_ER
22980 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e  ROR state guaran
22990 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  tees that.  ** t
229a0 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74  here is at least
229b0 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
229c0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c   page reference,
229d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
229e0 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66   ** is a no-op f
229f0 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79  or that case any
22a00 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32  how..  */..  u32
22a10 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
22a20 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
22a30 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
22a40 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
22a50 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
22a60 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
22a70 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  E) );.  if( (pPa
22a80 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
22a90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
22aa0 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  =0).   && sqlite
22ab0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
22ac0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
22ad0 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53  ==0 .   && pageS
22ae0 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
22af0 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61  =(u32)pPager->pa
22b00 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20  geSize .  ){.   
22b10 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55   char *pNew = NU
22b20 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  LL;             
22b30 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63  /* New temp spac
22b40 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79  e */.    i64 nBy
22b50 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  te = 0;..    if(
22b60 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
22b70 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73  PAGER_OPEN && is
22b80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
22b90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
22ba0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
22bb0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42  (pPager->fd, &nB
22bc0 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
22bd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22be0 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  K ){.      pNew 
22bf0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
22c00 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
22c10 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
22c20 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51   !pNew ) rc = SQ
22c30 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
22c40 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
22c50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22c60 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
22c70 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
22c80 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50  ger->dbSize = (P
22c90 67 6e 6f 29 28 6e 42 79 74 65 2f 70 61 67 65 53  gno)(nByte/pageS
22ca0 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
22cb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
22cc0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73  ageSize;.      s
22cd0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
22ce0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
22cf0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
22d00 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
22d10 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  w;.      sqlite3
22d20 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
22d30 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
22d40 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
22d50 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67    }.  }..  *pPag
22d60 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
22d70 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  pageSize;.  if( 
22d80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22d90 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
22da0 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
22db0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
22dc0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
22dd0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
22de0 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
22df0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
22e00 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
22e10 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
22e20 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
22e30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
22e40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
22e50 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
22e60 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
22e70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
22e80 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
22e90 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
22ea0 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
22eb0 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
22ec0 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
22ed0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
22ee0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
22ef0 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
22f00 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
22f10 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
22f20 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
22f30 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
22f40 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
22f50 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
22f60 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
22f70 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
22f80 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
22f90 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
22fa0 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
22fb0 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
22fc0 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
22fd0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
22fe0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
22ff0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
23000 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
23010 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
23020 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
23030 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
23040 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
23050 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
23060 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
23070 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
23080 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
23090 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
230a0 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
230b0 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
230c0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
230d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
230e0 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
230f0 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
23100 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
23110 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
23120 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
23130 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
23140 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
23150 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
23160 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
23170 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
23180 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
23190 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
231a0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20  PAGER_OPEN );   
231b0 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c     /* Called onl
231c0 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74  y by OP_MaxPgcnt
231d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
231e0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50  ager->mxPgno>=pP
231f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20  ager->dbSize ); 
23200 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   /* OP_MaxPgcnt 
23210 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f  enforces this */
23220 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
23230 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
23240 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
23250 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
23260 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
23270 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
23280 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
23290 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
232a0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
232b0 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
232c0 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
232d0 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
232e0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
232f0 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
23300 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
23310 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
23320 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
23330 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
23340 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
23350 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
23360 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
23370 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
23380 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
23390 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
233a0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
233b0 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
233c0 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
233d0 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
233e0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
233f0 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
23400 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
23410 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
23420 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
23430 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
23440 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
23450 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
23460 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
23470 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
23480 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
23490 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
234a0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
234b0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
234c0 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
234d0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
234e0 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
234f0 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
23500 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
23510 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
23520 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
23530 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
23540 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
23550 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
23560 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
23570 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20   transient file 
23580 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c  (zFilename==""),
23590 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e   or.** opened on
235a0 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61   a file less tha
235b0 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n N bytes in siz
235c0 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  e, the output bu
235d0 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65  ffer is.** zeroe
235e0 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
235f0 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61  returned. The ra
23600 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73  tionale for this
23610 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a   is that this .*
23620 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  * function is us
23630 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  ed to read datab
23640 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64  ase headers, and
23650 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74   a new transient
23660 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65   or.** zero size
23670 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61  d database has a
23680 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e   header than con
23690 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
236a0 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  f zeroes..**.** 
236b0 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  If any IO error 
236c0 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54  apart from SQLIT
236d0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
236e0 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  AD is encountere
236f0 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
23700 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
23710 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61   to the caller a
23720 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
23730 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
23740 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65   buffer undefine
23750 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
23760 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
23770 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
23780 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
23790 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
237a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
237b0 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
237c0 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
237d0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
237e0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
237f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
23800 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  );..  /* This ro
23810 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
23820 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d  lled by btree im
23830 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
23840 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
23850 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
23860 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62   There has not b
23870 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  een an opportuni
23880 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  ty to transition
23890 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64  .  ** to WAL mod
238a0 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e yet..  */.  as
238b0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
238c0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
238d0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
238e0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
238f0 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
23900 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
23910 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
23920 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
23930 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
23940 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
23950 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
23960 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
23970 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23980 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
23990 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
239a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
239b0 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  on may only be c
239c0 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61  alled when a rea
239d0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
239e0 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20   open on.** the 
239f0 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e  pager. It return
23a00 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
23a10 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
23a20 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
23a30 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
23a40 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
23a50 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73  en 1 and <page-s
23a60 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69  ize> bytes in si
23a70 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  ze, then .** thi
23a80 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  s is considered 
23a90 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a  a 1 page file..*
23aa0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
23ab0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
23ac0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
23ad0 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  *pnPage){.  asse
23ae0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
23af0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
23b00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
23b10 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
23b20 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
23b30 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65  HED );.  *pnPage
23b40 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e   = (int)pPager->
23b50 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  dbSize;.}.../*.*
23b60 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
23b70 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
23b80 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
23b90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
23ba0 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
23bb0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
23bc0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
23bd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
23be0 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
23bf0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
23c00 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
23c10 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
23c20 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
23c30 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
23c40 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
23c50 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
23c60 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
23c70 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
23c80 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
23c90 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
23ca0 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
23cb0 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
23cc0 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
23cd0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
23ce0 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
23cf0 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
23d00 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
23d10 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
23d20 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
23d30 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
23d40 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
23d50 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
23d60 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
23d70 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
23d80 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
23d90 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
23da0 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
23db0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
23dc0 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
23dd0 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
23de0 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
23df0 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
23e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23e20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
23e30 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
23e40 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
23e50 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
23e60 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
23e70 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
23e80 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65  ady held, or one
23e90 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74   of the transist
23ea0 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
23eb0 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
23ec0 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
23ed0 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
23ee0 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
23ef0 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
23f00 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
23f10 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
23f20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
23f30 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65  >eLock>=locktype
23f40 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
23f50 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
23f60 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
23f70 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
23f80 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
23f90 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  >eLock==RESERVED
23fa0 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
23fb0 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
23fc0 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a  K).  );..  do {.
23fd0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
23fe0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63  ckDb(pPager, loc
23ff0 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  ktype);.  }while
24000 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
24010 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
24020 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
24030 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
24040 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  g) );.  return r
24050 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63  c;.}../*.** Func
24060 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63  tion assertTrunc
24070 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
24080 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61  ager) checks tha
24090 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a  t one of the .**
240a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
240b0 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79  ue for all dirty
240c0 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
240d0 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
240e0 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54  he:.**.**   a) T
240f0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
24100 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
24110 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65  qual to the size
24120 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   of the .**     
24130 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
24140 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65  e image, in page
24150 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29  s, OR.**.**   b)
24160 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
24170 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65  tent were writte
24180 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  n at this time, 
24190 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  it would not.** 
241a0 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72       be necessar
241b0 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  y to write the c
241c0 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f  urrent content o
241d0 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  ut to the sub-jo
241e0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61  urnal.**      (a
241f0 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
24200 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71  function subjReq
24210 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a  uiresPage())..**
24220 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69  .** If the condi
24230 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79  tion asserted by
24240 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
24250 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
24260 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  d the.** dirty p
24270 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64  age were to be d
24280 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68  iscarded from th
24290 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20  e cache via the 
242a0 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
242b0 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53   routine, pagerS
242c0 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f  tress() would no
242d0 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  t write the curr
242e0 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
242f0 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   to.** the datab
24300 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73  ase file. If a s
24310 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
24320 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64  tion were rolled
24330 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74   back after.** t
24340 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68  his happened, th
24350 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
24360 6f 75 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  our would be to 
24370 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  restore the curr
24380 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  ent.** content o
24390 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65  f the page. Howe
243a0 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20  ver, since this 
243b0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70  content is not p
243c0 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72  resent in either
243d0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
243e0 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72   file or the por
243f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c  tion of the roll
24400 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
24410 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   .** sub-journal
24420 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
24430 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e   content could n
24440 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  ot be restored a
24450 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  nd the.** databa
24460 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62  se image would b
24470 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49  ecome corrupt. I
24480 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66  t is therefore f
24490 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a  ortunate that .*
244a0 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61  * this circumsta
244b0 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65  nce cannot arise
244c0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
244d0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73  (SQLITE_DEBUG).s
244e0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
244f0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
24500 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67  intCb(PgHdr *pPg
24510 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
24520 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
24530 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RTY );.  assert(
24540 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
24550 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  ge(pPg) || pPg->
24560 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65  pgno<=pPg->pPage
24570 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73  r->dbSize );.}.s
24580 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
24590 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
245a0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
245b0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
245c0 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
245d0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
245e0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
245f0 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a  onstraintCb);.}.
24600 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61  #else.# define a
24610 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
24620 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a  straint(pPager).
24630 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
24640 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  uncate the in-me
24650 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mory database fi
24660 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67  le image to nPag
24670 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a  e pages. This .*
24680 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  * function does 
24690 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
246a0 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
246b0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49   file on disk. I
246c0 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20  t .** just sets 
246d0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
246e0 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
246f0 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74  object so that t
24700 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f  he .** truncatio
24710 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77  n will be done w
24720 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
24730 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
24740 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69  ommitted..*/.voi
24750 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  d sqlite3PagerTr
24760 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65  uncateImage(Page
24770 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
24780 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
24790 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
247a0 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73  >=nPage );.  ass
247b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
247c0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
247d0 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
247e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
247f0 20 6e 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74   nPage;.  assert
24800 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
24810 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a  nt(pPager);.}...
24820 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24830 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
24840 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
24850 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
24860 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79  llback. It.** sy
24870 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ncs the journal 
24880 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68  file to disk, th
24890 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e  en sets pPager->
248a0 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68  journalHdr to th
248b0 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65  e.** size of the
248c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f   journal file so
248d0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f   that the pager_
248e0 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
248f0 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74  ne knows.** that
24900 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
24910 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
24920 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  n synced..**.** 
24930 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  Syncing a hot-jo
24940 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65  urnal to disk be
24950 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
24960 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  to roll it back 
24970 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74  ensures .** that
24980 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c   if a power-fail
24990 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ure occurs durin
249a0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20  g the rollback, 
249b0 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
249c0 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c  .** attempts rol
249d0 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
249e0 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20  system recovery 
249f0 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f  sees the same jo
24a00 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74  urnal.** content
24a10 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73   as this process
24a20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
24a30 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c  thing goes as pl
24a40 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  anned, SQLITE_OK
24a50 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
24a60 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20  herwise, .** an 
24a70 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
24a80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
24a90 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
24aa0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
24ab0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
24ac0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
24ad0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
24ae0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
24af0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
24b00 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
24b10 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d  YNC_NORMAL);.  }
24b20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24b30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
24b40 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
24b50 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
24b60 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
24b70 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
24b80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24b90 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
24ba0 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
24bb0 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
24bc0 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
24bd0 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
24be0 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
24bf0 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
24c00 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
24c10 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
24c20 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
24c30 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
24c40 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
24c50 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
24c60 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
24c70 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
24c80 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
24c90 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
24ca0 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
24cb0 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
24cc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
24cd0 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
24ce0 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
24cf0 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
24d00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
24d10 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
24d20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
24d30 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
24d40 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
24d50 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
24d60 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
24d70 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
24d80 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
24d90 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
24da0 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
24db0 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
24dc0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
24dd0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
24de0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
24df0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
24e00 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75  er *pPager){.  u
24e10 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29  8 *pTmp = (u8 *)
24e20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
24e30 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73  e;..  assert( as
24e40 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
24e50 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69  (pPager) );.  di
24e60 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
24e70 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
24e80 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
24e90 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a 20  nMalloc();.  /* 
24ea0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
24eb0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
24ec0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
24ed0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
24ee0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73  ITE_OMIT_WAL.  s
24ef0 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70  qlite3WalClose(p
24f00 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61  Pager->pWal, pPa
24f10 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
24f20 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  gs, pPager->page
24f30 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70  Size, pTmp);.  p
24f40 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b  Pager->pWal = 0;
24f50 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f  .#endif.  pager_
24f60 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
24f70 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
24f80 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
24f90 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
24fa0 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73  .    /* If it is
24fb0 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20   open, sync the 
24fc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
24fd0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f  ore calling Unlo
24fe0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20  ckAndRollback.. 
24ff0 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
25000 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20   not done, then 
25010 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  an unsynced port
25020 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ion of the open 
25030 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
25040 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79  file may be play
25050 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
25060 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
25070 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
25080 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69  curs .    ** whi
25090 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65  le this is happe
250a0 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61  ning, the databa
250b0 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20  se could become 
250c0 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a  corrupt..    **.
250d0 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72      ** If an err
250e0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
250f0 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74  trying to sync t
25100 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66  he journal, shif
25110 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
25120 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ** into the ERRO
25130 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61  R state. This ca
25140 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  uses UnlockAndRo
25150 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b  llback to unlock
25160 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
25170 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  base and close t
25180 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
25190 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
251a0 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20  ng to roll it.  
251b0 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e    ** back or fin
251c0 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65  alize it. The ne
251d0 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72  xt database user
251e0 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f   will have to do
251f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot-journal.   
25200 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66   ** rollback bef
25210 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ore accessing th
25220 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
25230 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25240 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
25250 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  fd) ){.      pag
25260 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
25270 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
25280 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20  rnal(pPager));. 
25290 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
252a0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
252b0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
252c0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
252d0 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
252e0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
252f0 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
25300 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
25310 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
25320 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
25330 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
25340 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
25350 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
25360 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74  r->jfd);.  sqlit
25370 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
25380 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
25390 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a  PageFree(pTmp);.
253a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
253b0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43  lose(pPager->pPC
253c0 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53  ache);..#ifdef S
253d0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
253e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
253f0 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65  odecFree ) pPage
25400 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50  r->xCodecFree(pP
25410 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23  ager->pCodec);.#
25420 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
25430 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   !pPager->aSavep
25440 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  oint && !pPager-
25450 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
25460 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
25470 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
25480 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
25490 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c  >sjfd) );..  sql
254a0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
254b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
254c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
254d0 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
254e0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
254f0 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
25500 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
25510 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67  ber for page pPg
25520 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
25530 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
25540 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
25550 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e   return pPg->pgn
25560 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
25570 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
25580 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
25590 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
255a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
255b0 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
255c0 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
255d0 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a  acheRef(pPg);.}.
255e0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
255f0 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65  journal. In othe
25600 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
25610 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
25620 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
25630 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
25640 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
25650 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
25660 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
25670 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63  he.** disk and c
25680 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
25690 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
256a0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
256b0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
256c0 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
256d0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
256e0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
256f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
25700 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61  Otherwise, the a
25710 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ctions required 
25720 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f  depend on the jo
25730 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74  urnal-mode and t
25740 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68  he .** device ch
25750 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
25760 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79   the the file-sy
25770 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  stem, as follows
25780 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
25790 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
257a0 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
257b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f  journal file, no
257c0 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20   action need.** 
257d0 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a      be taken..**
257e0 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73  .**   * Otherwis
257f0 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65  e, if the device
25800 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
25810 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e  t the SAFE_APPEN
25820 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20  D property,.**  
25830 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63     then the nRec
25840 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
25850 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
25860 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
25870 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64  er.**     is upd
25880 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
25890 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  the number of jo
258a0 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68  urnal records th
258b0 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62  at have.**     b
258c0 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c  een written foll
258d0 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65  owing it. If the
258e0 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74   pager is operat
258f0 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63  ing in full-sync
25900 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68  .**     mode, th
25910 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
25920 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65  ile is synced be
25930 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20  fore this field 
25940 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
25950 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76  *   * If the dev
25960 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
25970 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54  port the SEQUENT
25980 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68  IAL property, th
25990 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  en .**     journ
259a0 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
259b0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20  d..**.** Or, in 
259c0 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a  pseudo-code:.**.
259d0 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e  **   if( NOT <in
259e0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e  -memory journal>
259f0 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   ){.**     if( N
25a00 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29  OT SAFE_APPEND )
25a10 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c  {.**       if( <
25a20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20  full-sync mode> 
25a30 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
25a40 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20   file>);.**     
25a50 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66    <update nRec f
25a60 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a  ield>.**     } .
25a70 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
25a80 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e  EQUENTIAL ) xSyn
25a90 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
25aa0 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  );.**   }.**.** 
25ab0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
25ac0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
25ad0 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  rs the PGHDR_NEE
25ae0 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65  D_SYNC flag of e
25af0 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75  very .** page cu
25b00 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20  rrently held in 
25b10 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65  memory before re
25b20 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
25b30 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65  K. If an IO.** e
25b40 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
25b50 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  red, then the IO
25b60 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
25b70 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
25b80 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
25b90 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
25ba0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25bb0 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69  int newHdr){.  i
25bc0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25be0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
25bf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
25c00 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
25c10 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
25c20 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
25c30 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
25c40 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
25c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
25c60 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
25c70 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
25c80 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
25c90 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
25ca0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25cb0 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
25cc0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
25cd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
25ce0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
25cf0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
25d00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
25d10 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
25d20 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
25d30 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
25d40 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
25d50 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
25d60 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
25d70 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Y ){.      const
25d80 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
25d90 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
25da0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
25db0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
25dc0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
25dd0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20  er->jfd) );..   
25de0 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
25df0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
25e00 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
25e10 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
25e20 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20  k deals with an 
25e30 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e  obscure problem.
25e40 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   If the last con
25e50 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nection.        
25e60 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f  ** that wrote to
25e70 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
25e80 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  as operating in 
25e90 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e  persistent-journ
25ea0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  al.        ** mo
25eb0 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
25ec0 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74  rnal file may at
25ed0 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75   this point actu
25ee0 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20  ally be larger. 
25ef0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50         ** than P
25f00 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
25f10 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65  bytes. If the ne
25f20 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20  xt thing in the 
25f30 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
25f40 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20  ** file happens 
25f50 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d  to be a journal-
25f60 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20  header (written 
25f70 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
25f80 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
25f90 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20  us connection's 
25fa0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e  transaction), an
25fb0 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  d a crash or pow
25fc0 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20  er-failure .    
25fd0 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66      ** occurs af
25fe0 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61  ter nRec is upda
25ff0 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
26000 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
26010 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a  rites .        *
26020 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  * anything else 
26030 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
26040 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f  ile (or commits/
26050 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a  rolls back its .
26060 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
26070 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51  action), then SQ
26080 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  Lite may become 
26090 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f  confused when do
260a0 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
260b0 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
260c0 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
260d0 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20  ng recovery. It 
260e0 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c  may roll back al
260f0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  l.        ** of 
26100 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  this connections
26110 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63   data, then proc
26120 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62  eed to rolling b
26130 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20  ack the old,.   
26140 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64       ** out-of-d
26150 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  ate data that fo
26160 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61  llows it. Databa
26170 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
26180 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
26190 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f    ** To work aro
261a0 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65  und this, if the
261b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
261c0 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e  es appear to con
261d0 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tain.        ** 
261e0 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66  a valid header f
261f0 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a  ollowing Pager.j
26200 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20  ournalOff, then 
26210 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20  write a 0x00.   
26220 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20       ** byte to 
26230 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20  the start of it 
26240 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72  to prevent it fr
26250 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69  om being recogni
26260 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  zed..        **.
26270 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61          ** Varia
26280 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73  ble iNextHdrOffs
26290 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
262a0 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68   offset at which
262b0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
262c0 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61   problematic hea
262d0 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20  der will occur, 
262e0 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d  if it exists. aM
262f0 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20  agic is used .  
26300 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65        ** as a te
26310 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
26320 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69  o inspect the fi
26330 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
26340 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  tes of.        *
26350 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  * the potential 
26360 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
26370 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26380 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f     i64 iNextHdrO
26390 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75  ffset;.        u
263a0 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20  8 aMagic[8];.   
263b0 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b       u8 zHeader[
263c0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
263d0 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20  agic)+4];..     
263e0 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
263f0 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
26400 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
26410 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
26420 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
26430 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
26440 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
26450 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
26460 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66       iNextHdrOff
26470 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
26480 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
26490 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
264a0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
264b0 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
264c0 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  8, iNextHdrOffse
264d0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
264e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
264f0 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69   0==memcmp(aMagi
26500 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
26510 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 8) ){.        
26520 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
26530 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a  8 zerobyte = 0;.
26540 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
26550 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
26560 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f  ager->jfd, &zero
26570 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64  byte, 1, iNextHd
26580 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
26590 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
265a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
265b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
265c0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
265d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
265e0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
265f0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
26600 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
26610 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
26620 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
26630 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
26640 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
26650 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
26660 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
26670 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
26680 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
26690 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
266a0 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
266b0 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
266c0 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
266d0 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
266e0 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
266f0 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
26700 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
26710 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
26720 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
26730 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
26740 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
26750 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
26760 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
26770 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
26780 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
26790 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
267a0 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
267b0 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
267c0 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
267d0 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
267e0 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
267f0 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
26800 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
26810 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
26820 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
26830 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
26840 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
26850 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
26860 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
26870 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
26880 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
26890 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
268a0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
268b0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
268c0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
268d0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
268e0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
268f0 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
26900 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
26910 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
26920 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
26930 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
26940 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
26950 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26960 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
26970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
26980 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
26990 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72   %lld\n", pPager
269a0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
269b0 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20  lHdr));.        
269c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
269d0 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ite(.           
269e0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48   pPager->jfd, zH
269f0 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48  eader, sizeof(zH
26a00 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e  eader), pPager->
26a10 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
26a20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
26a30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26a40 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
26a50 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
26a60 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
26a70 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
26a80 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
26a90 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
26aa0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
26ab0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
26ac0 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
26ad0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
26ae0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
26af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26b00 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
26b10 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  , pPager->syncFl
26b20 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ags| .          
26b30 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61  (pPager->syncFla
26b40 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  gs==SQLITE_SYNC_
26b50 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43  FULL?SQLITE_SYNC
26b60 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20  _DATAONLY:0).   
26b70 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
26b80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26b90 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
26ba0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
26bb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
26bc0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
26bd0 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28  alOff;.      if(
26be0 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69   newHdr && 0==(i
26bf0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
26c00 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
26c10 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
26c20 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
26c30 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
26c40 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
26c50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
26c60 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
26c70 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
26c80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26c90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
26ca0 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
26cb0 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20  rnalOff;.    }. 
26cc0 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20   }..  /* Unless 
26cd0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
26ce0 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  noSync mode, the
26cf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61   journal file wa
26d00 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63  s just .  ** suc
26d10 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
26d20 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c  . Either way, cl
26d30 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
26d40 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20  ED_SYNC flag on 
26d50 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e  .  ** all pages.
26d60 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
26d70 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c  cacheClearSyncFl
26d80 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ags(pPager->pPCa
26d90 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  che);.  pPager->
26da0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
26db0 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61  RITER_DBMOD;.  a
26dc0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
26dd0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
26de0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ) );.  return SQ
26df0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
26e00 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
26e10 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
26e20 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
26e30 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e  dirty pages conn
26e40 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ected.** by the 
26e50 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
26e60 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  nter. This funct
26e70 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20  ion writes each 
26e80 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  one of the.** in
26e90 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e  -memory pages in
26ea0 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65   the list to the
26eb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
26ec0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79  The argument may
26ed0 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70  .** be NULL, rep
26ee0 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70  resenting an emp
26ef0 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73  ty list. In this
26f00 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74   case this funct
26f10 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ion is.** a no-o
26f20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  p..**.** The pag
26f30 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20  er must hold at 
26f40 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
26f50 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20   lock when this 
26f60 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
26f70 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72  alled. Before wr
26f80 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74  iting anything t
26f90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
26fa0 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a  ile, this lock.*
26fb0 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f  * is upgraded to
26fc0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
26fd0 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
26fe0 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
26ff0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed,.** SQLITE_BU
27000 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  SY is returned a
27010 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72  nd no data is wr
27020 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
27030 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
27040 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
27050 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70  is a temp-file p
27060 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74  ager and the act
27070 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ual file-system 
27080 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79  file.** is not y
27090 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63  et open, it is c
270a0 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  reated and opene
270b0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
270c0 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  a is .** written
270d0 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65   out..**.** Once
270e0 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
270f0 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c  en upgraded and,
27100 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74   if necessary, t
27110 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a  he file opened,.
27120 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65  ** the pages are
27130 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
27140 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27150 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e  e in list order.
27160 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61   Writing.** a pa
27170 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ge is skipped if
27180 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72   it meets either
27190 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
271a0 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a  g criteria:.**.*
271b0 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e  *   * The page n
271c0 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
271d0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
271e0 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68  ze, or.**   * Th
271f0 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
27200 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  TE flag is set o
27210 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
27220 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74  * If writing out
27230 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74   a page causes t
27240 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27250 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e   to grow, Pager.
27260 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73  dbFileSize.** is
27270 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
27280 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20  ngly. If page 1 
27290 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20  is written out, 
272a0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63  then the value c
272b0 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65  ached.** in Page
272c0 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
272d0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74  s updated to mat
272e0 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ch the new value
272f0 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68   stored in.** th
27300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
27310 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
27320 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
27330 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
27340 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
27350 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   IO error .** oc
27360 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
27370 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
27380 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45  ed. Or, if the E
27390 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61  XCLUSIVE lock ca
273a0 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69  nnot.** be obtai
273b0 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ned, SQLITE_BUSY
273c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
273d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
273e0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
273f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
27400 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
27410 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27420 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
27430 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27440 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
27450 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
27460 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72  nly called for r
27470 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69  ollback pagers i
27480 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73  n WRITER_DBMOD s
27490 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tate. */.  asser
274a0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
274b0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
274c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
274d0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
274e0 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73  R_DBMOD );.  ass
274f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
27500 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
27510 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
27520 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
27530 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
27540 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
27550 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
27560 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
27570 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
27580 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
27590 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
275a0 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
275b0 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
275c0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
275d0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
275e0 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
275f0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
27600 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
27610 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
27620 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
27630 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
27640 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
27650 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
27660 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
27670 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
27680 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
27690 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
276a0 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
276b0 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
276c0 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
276d0 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
276e0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
276f0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
27700 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
27710 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27720 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  OK && pPager->db
27730 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 48  Size>pPager->dbH
27740 69 6e 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 73  intSize ){.    s
27750 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46  qlite3_int64 szF
27760 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ile = pPager->pa
27770 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65  geSize * (sqlite
27780 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e  3_int64)pPager->
27790 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69  dbSize;.    sqli
277a0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
277b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
277c0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
277d0 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20  INT, &szFile);. 
277e0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e     pPager->dbHin
277f0 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
27800 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77  dbSize;.  }..  w
27810 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
27820 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
27830 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
27840 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
27850 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
27860 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
27870 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
27880 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
27890 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
278a0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
278b0 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
278c0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
278d0 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
278e0 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
278f0 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
27900 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
27910 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
27920 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
27930 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
27940 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
27950 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
27960 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
27970 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
27980 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
27990 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
279a0 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
279b0 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
279c0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
279d0 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
279e0 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
279f0 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
27a00 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
27a10 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
27a20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
27a30 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
27a40 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
27a50 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
27a60 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
27a70 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
27a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27aa0 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
27ab0 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
27ac0 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74    assert( (pList
27ad0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
27ae0 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
27af0 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
27b00 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f  pgno==1 ) pager_
27b10 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
27b20 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20  ter(pList);..   
27b30 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
27b40 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
27b50 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
27b60 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
27b70 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
27b80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
27b90 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
27ba0 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
27bb0 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
27bc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27bd0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
27be0 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
27bf0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
27c00 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  t);..      /* If
27c10 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74   page 1 was just
27c20 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
27c30 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
27c40 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20  s to match.     
27c50 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f   ** the value no
27c60 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  w stored in the 
27c70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
27c80 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a  f writing this .
27c90 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61        ** page ca
27ca0 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73  used the databas
27cb0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
27cc0 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a  update dbFileSiz
27cd0 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
27ce0 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
27cf0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
27d00 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
27d10 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
27d20 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
27d30 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
27d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
27d50 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
27d60 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
27d70 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
27d80 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
27d90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
27da0 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
27db0 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
27dc0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
27dd0 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
27de0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
27df0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
27e00 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
27e10 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70  o, (u8*)pList->p
27e20 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41  Data);..      PA
27e30 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45  GERTRACE(("STORE
27e40 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
27e50 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
27e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
27e70 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
27e80 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
27e90 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20  ash(pList)));.  
27ea0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
27eb0 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
27ec0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
27ed0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
27ee0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
27ef0 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
27f00 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
27f10 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20  ager->nWrite);. 
27f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27f30 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
27f40 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
27f50 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
27f60 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  er), pgno));.   
27f70 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
27f80 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
27f90 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  ;.    pList = pL
27fa0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
27fb0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
27fc0 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74  ../*.** Ensure t
27fd0 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  hat the sub-jour
27fe0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
27ff0 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
28000 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a  dy open, this .*
28010 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
28020 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  no-op..**.** SQL
28030 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
28040 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
28050 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20   goes according 
28060 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20  to plan. An .** 
28070 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
28080 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
28090 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c  eturned if a cal
280a0 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70  l to sqlite3OsOp
280b0 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a  en() .** fails..
280c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
280d0 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67  enSubJournal(Pag
280e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
280f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28100 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  K;.  if( !isOpen
28110 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
28120 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
28130 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
28140 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
28150 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65  _MEMORY || pPage
28160 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
28170 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28180 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
28190 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
281a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
281b0 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
281c0 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
281d0 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f  ->sjfd, SQLITE_O
281e0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b  PEN_SUBJOURNAL);
281f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
28200 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28210 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64   Append a record
28220 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
28230 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50  state of page pP
28240 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  g to the sub-jou
28250 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20  rnal. .** It is 
28260 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
28270 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73  onsibility to us
28280 65 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  e subjRequiresPa
28290 67 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a  ge() to check .*
282a0 2a 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61  * that it is rea
282b0 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66  lly required bef
282c0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
282d0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
282e0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
282f0 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72  set the bit corr
28300 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67  esponding to pPg
28310 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69  ->pgno in the bi
28320 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c  tvecs.** for all
28330 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
28340 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
28350 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  g..**.** This fu
28360 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
28370 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
28380 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
28390 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65  sful, an IO.** e
283a0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65  rror code if the
283b0 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
283c0 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  e to the sub-jou
283d0 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
283e0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
283f0 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
28400 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20  s while setting 
28410 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70  a bit in a savep
28420 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a  oint.** bitvec..
28430 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
28440 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48  bjournalPage(PgH
28450 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20  dr *pPg){.  int 
28460 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28470 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
28480 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
28490 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
284a0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
284b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
284c0 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ){..    /* Open 
284d0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c  the sub-journal,
284e0 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
284f0 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
28500 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ed */.    assert
28510 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
28520 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  rnal );.    asse
28530 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
28540 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72  r->jfd) || pager
28550 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
28560 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
28570 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
28580 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53  d) || pPager->nS
28590 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  ubRec==0 );.    
285a0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
285b0 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20  Wal(pPager) .   
285c0 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a        || pageInJ
285d0 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20  ournal(pPg) .   
285e0 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67        || pPg->pg
285f0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
28600 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20  gSize .    );.  
28610 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f    rc = openSubJo
28620 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a  urnal(pPager);..
28630 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75      /* If the su
28640 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70  b-journal was op
28650 65 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ened successfull
28660 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64  y (or was alread
28670 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20  y open),.    ** 
28680 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  write the journa
28690 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  l record into th
286a0 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  e file.  */.    
286b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
286c0 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  K ){.      void 
286d0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
286e0 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f  ata;.      i64 o
286f0 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
28700 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
28710 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
28720 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
28730 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43  ;.  .      CODEC
28740 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
28750 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
28760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
28770 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
28780 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
28790 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
287a0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
287b0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
287c0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
287d0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
287e0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
287f0 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
28800 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
28810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28820 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28830 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
28840 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  ->sjfd, pData2, 
28850 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
28860 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
28870 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
28880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28890 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
288a0 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20  ->nSubRec++;.   
288b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
288c0 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b  >nSavepoint>0 );
288d0 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53  .    rc = addToS
288e0 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
288f0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
28900 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
28910 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
28920 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
28930 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
28940 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
28950 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
28960 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
28970 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72  y limit. The fir
28980 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
28990 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
289a0 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63  ger object.** (c
289b0 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e  ast as a void*).
289c0 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   The pager is al
289d0 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27  ways 'purgeable'
289e0 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f   (not an in-memo
289f0 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e  ry.** database).
28a00 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
28a10 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65  ment is a refere
28a20 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68  nce to a page th
28a30 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e  at is .** curren
28a40 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61  tly dirty but ha
28a50 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
28a60 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65   references. The
28a70 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61   page.** is alwa
28a80 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
28a90 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  th the Pager obj
28aa0 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
28ab0 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
28ac0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
28ad0 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63  job of this func
28ae0 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20  tion is to make 
28af0 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69  pPg clean by wri
28b00 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74  ting its content
28b10 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20  s.** out to the 
28b20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
28b30 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73  f possible. This
28b40 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e   may involve syn
28b50 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cing the.** jour
28b60 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  nal file. .**.**
28b70 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
28b80 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
28b90 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c  eClean() is call
28ba0 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  ed on the page a
28bb0 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
28bc0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
28bd0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
28be0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
28bf0 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  make the.** page
28c00 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65   clean, the IO e
28c10 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
28c20 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61  urned. If the pa
28c30 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ge cannot be.** 
28c40 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73  made clean for s
28c50 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ome other reason
28c60 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
28c70 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
28c80 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
28c90 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  rned by sqlite3P
28ca0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
28cb0 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a   is not called..
28cc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
28cd0 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
28ce0 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
28cf0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
28d00 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
28d10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28d20 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
28d30 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
28d40 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
28d50 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
28d60 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20  _DIRTY );..  /* 
28d70 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69  The doNotSyncSpi
28d80 6c 6c 20 66 6c 61 67 20 69 73 20 73 65 74 20 64  ll flag is set d
28d90 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e  uring times when
28da0 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66   doing a sync of
28db0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  .  ** journal (a
28dc0 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20  nd adding a new 
28dd0 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61  header) is not a
28de0 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63  llowed.  This oc
28df0 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
28e00 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
28e10 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68  3PagerWrite() wh
28e20 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f  ile trying to jo
28e30 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20  urnal multiple. 
28e40 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67   ** pages belong
28e50 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ing to the same 
28e60 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  sector..  **.  *
28e70 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c  * The doNotSpill
28e80 20 66 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61   flag inhibits a
28e90 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e  ll cache spillin
28ea0 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  g regardless of 
28eb0 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20  whether.  ** or 
28ec0 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65  not a sync is re
28ed0 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73  quired.  This is
28ee0 20 73 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f   set during a ro
28ef0 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  llback..  **.  *
28f00 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c  * Spilling is al
28f10 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77 68  so prohibited wh
28f20 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  en in an error s
28f30 74 61 74 65 20 73 69 6e 63 65 20 74 68 61 74 20  tate since that 
28f40 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20  could.  ** lead 
28f50 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
28f60 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65  uption.   In the
28f70 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
28f80 6e 74 61 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20  ntaton it .  ** 
28f90 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f  is impossible fo
28fa0 72 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 46  r sqlite3PCacheF
28fb0 65 74 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c  etch() to be cal
28fc0 6c 65 64 20 77 69 74 68 20 63 72 65 61 74 65 46  led with createF
28fd0 6c 61 67 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c  lag==1.  ** whil
28fe0 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  e in the error s
28ff0 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69  tate, hence it i
29000 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72  s impossible for
29010 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
29020 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  .  ** be called 
29030 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
29040 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  te.  Nevertheles
29050 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20  s, we include a 
29060 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73  NEVER().  ** tes
29070 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20  t for the error 
29080 73 74 61 74 65 20 61 73 20 61 20 73 61 66 65 67  state as a safeg
29090 75 61 72 64 20 61 67 61 69 6e 73 74 20 66 75 74  uard against fut
290a0 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a  ure changes..  *
290b0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 68 61 73 53  /.  pPager->hasS
290c0 65 65 6e 53 74 72 65 73 73 20 3d 20 31 3b 0a 20  eenStress = 1;. 
290d0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
290e0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
290f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29100 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
29110 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72  NotSpill ) retur
29120 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
29130 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  f( pPager->doNot
29140 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50  SyncSpill && (pP
29150 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
29160 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29  _NEED_SYNC)!=0 )
29170 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
29180 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
29190 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
291a0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
291b0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
291c0 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67   /* Write a sing
291d0 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69  le frame for thi
291e0 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f  s page to the lo
291f0 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75  g. */.    if( su
29200 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
29210 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63  Pg) ){ .      rc
29220 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
29230 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20  e(pPg); .    }. 
29240 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
29260 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65   = pagerWalFrame
29270 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30  s(pPager, pPg, 0
29280 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
29290 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f   }else{.  .    /
292a0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
292b0 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69  al file if requi
292c0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
292d0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
292e0 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20  _NEED_SYNC .    
292f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
29300 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
29310 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b  _CACHEMOD.    ){
29320 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
29330 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
29340 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  1);.    }.  .   
29350 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
29360 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70  number of this p
29370 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  age is larger th
29380 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  an the current s
29390 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ize of.    ** th
293a0 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
293b0 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f  , it may need to
293c0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
293d0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
293e0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
293f0 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
29400 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  to pager_write_p
29410 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20  agelist() below 
29420 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  will not.    ** 
29430 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64  actually write d
29440 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20  ata to the file 
29450 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
29460 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73    **.    ** Cons
29470 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
29480 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65  ng sequence of e
29490 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  vents:.    **.  
294a0 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20    **   BEGIN;.  
294b0 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61    **     <journa
294c0 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a  l page X>.    **
294d0 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67       <modify pag
294e0 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X>.    **     
294f0 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20  SAVEPOINT sp;.  
29500 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69    **       <shri
29510 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  nk database file
29520 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20   to Y pages>.   
29530 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72 53   **       pagerS
29540 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20 20  tress(page X).  
29550 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43    **     ROLLBAC
29560 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a  K TO sp;.    **.
29570 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c      ** If (X>Y),
29580 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72   then when pager
29590 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64  Stress is called
295a0 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74   page X will not
295b0 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20   be written.    
295c0 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
295d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74  tabase file, but
295e0 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64   will be dropped
295f0 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e   from the cache.
29600 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f   Then,.    ** fo
29610 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c  llowing the "ROL
29620 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61  LBACK TO sp" sta
29630 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20  tement, reading 
29640 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64  page X will read
29650 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  .    ** data fro
29660 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
29670 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62  ile. This will b
29680 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61  e the copy of pa
29690 67 65 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a  ge X as it.    *
296a0 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 74  * was when the t
296b0 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
296c0 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61  ed, not as it wa
296d0 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e  s when "SAVEPOIN
296e0 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73  T sp".    ** was
296f0 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a   executed..    *
29700 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
29710 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74  ution is to writ
29720 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  e the current da
29730 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e  ta for page X in
29740 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  to the .    ** s
29750 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
29760 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f  now (if it is no
29770 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 29  t already there)
29780 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  , so that it wil
29790 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74  l.    ** be rest
297a0 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72 72  ored to its curr
297b0 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74  ent value when t
297c0 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
297d0 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65  sp" is .    ** e
297e0 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  xecuted..    */.
297f0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20      if( NEVER(. 
29800 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
29810 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e  E_OK && pPg->pgn
29820 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o>pPager->dbSize
29830 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
29840 50 61 67 65 28 70 50 67 29 0a 20 20 20 20 29 20  Page(pPg).    ) 
29850 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
29860 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
29870 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
29880 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e  /* Write the con
29890 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
298a0 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  e out to the dat
298b0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
298c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
298d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
298e0 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67  sert( (pPg->flag
298f0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
29900 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  C)==0 );.      r
29910 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
29920 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c  pagelist(pPager,
29930 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   pPg);.    }.  }
29940 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
29950 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
29960 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
29970 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
29980 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
29990 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
299a0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
299b0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
299c0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
299d0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
299e0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
299f0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
29a00 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   rc); .}.../*.**
29a10 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
29a20 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50  itialize a new P
29a30 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  ager object and 
29a40 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
29a50 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67   it.** in *ppPag
29a60 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68  er. The pager sh
29a70 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
29a80 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73  be freed by pass
29a90 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c  ing it.** to sql
29aa0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
29ab0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
29ac0 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
29ad0 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  s the path to th
29ae0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29af0 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a  to open..** If z
29b00 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
29b10 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
29b20 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
29b30 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
29b40 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
29b50 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
29b60 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79  ached. Temporary
29b70 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65   files are be de
29b80 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
29b90 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79  ically when they
29ba0 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20   are closed. If 
29bb0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
29bc0 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a  emory:" then .**
29bd0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
29be0 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
29bf0 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  e. It is never w
29c00 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
29c10 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20  .** This can be 
29c20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
29c30 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
29c40 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
29c50 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65  he nExtra parame
29c60 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68  ter specifies th
29c70 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
29c80 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
29c90 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69  ated.** along wi
29ca0 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66  th each page ref
29cb0 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61  erence. This spa
29cc0 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
29cd0 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76  to the user.** v
29ce0 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ia the sqlite3Pa
29cf0 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50  gerGetExtra() AP
29d00 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  I..**.** The fla
29d10 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75  gs argument is u
29d20 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70  sed to specify p
29d30 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61  roperties that a
29d40 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65  ffect the.** ope
29d50 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  ration of the pa
29d60 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  ger. It should b
29d70 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69  e passed some bi
29d80 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  twise combinatio
29d90 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45  n.** of the PAGE
29da0 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  R_OMIT_JOURNAL a
29db0 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44  nd PAGER_NO_READ
29dc0 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  LOCK flags..**.*
29dd0 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
29de0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
29df0 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
29e00 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
29e10 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
29e20 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
29e30 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
29e40 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
29e50 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
29e60 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
29e70 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
29e80 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
29e90 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
29ea0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
29eb0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
29ec0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
29ed0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
29ee0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
29ef0 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
29f00 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
29f10 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
29f20 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
29f30 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
29f40 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
29f50 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
29f60 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
29f70 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
29f80 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
29f90 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
29fa0 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
29fb0 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
29fc0 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
29fd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
29fe0 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
29ff0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2a000 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2a010 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
2a020 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
2a030 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
2a040 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
2a050 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2a060 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2a070 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2a080 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
2a090 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2a0a0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2a0b0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
2a0c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2a0d0 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
2a0e0 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2a0f0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2a100 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2a110 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
2a120 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
2a130 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
2a140 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
2a150 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
2a160 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
2a170 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
2a180 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
2a190 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
2a1a0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
2a1b0 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2a1c0 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
2a1d0 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
2a1e0 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
2a1f0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
2a200 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
2a210 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
2a220 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2a230 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2a240 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
2a250 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
2a260 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
2a270 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
2a280 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
2a290 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
2a2a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2a2b0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2a2c0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
2a2d0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
2a2e0 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
2a2f0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2a300 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
2a310 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
2a320 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
2a330 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2a340 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
2a350 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
2a360 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
2a370 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
2a380 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
2a390 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2a3a0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
2a3b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a3c0 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
2a3d0 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
2a3e0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
2a3f0 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
2a400 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
2a410 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
2a420 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
2a430 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
2a440 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
2a450 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20  ADLOCK)!=0;  /* 
2a460 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61  True to omit rea
2a470 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d-lock */.  int 
2a480 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
2a490 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2a4a0 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
2a4b0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2a4c0 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32   PCache */.  u32
2a4d0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2a4e0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2a4f0 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
2a500 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
2a510 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a520 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  Uri = 0;    /* U
2a530 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20  RI args to copy 
2a540 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20  */.  int nUri = 
2a550 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
2a560 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2a570 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20   of URI args at 
2a580 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46  *zUri */..  /* F
2a590 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
2a5a0 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
2a5b0 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
2a5c0 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
2a5d0 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
2a5e0 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
2a5f0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
2a600 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
2a610 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
2a620 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
2a630 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
2a640 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
2a650 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2a660 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
2a670 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
2a680 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
2a690 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
2a6a0 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
2a6b0 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
2a6c0 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
2a6d0 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
2a6e0 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
2a6f0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
2a700 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
2a710 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2a720 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2a730 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
2a740 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
2a750 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
2a760 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
2a770 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2a780 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
2a790 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
2a7a0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2a7b0 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2a7c0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2a7d0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
2a7e0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2a7f0 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2a800 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
2a810 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
2a820 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
2a830 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
2a840 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
2a850 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
2a860 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  ager = 0;..#ifnd
2a870 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
2a880 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c  EMORYDB.  if( fl
2a890 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f  ags & PAGER_MEMO
2a8a0 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20  RY ){.    memDb 
2a8b0 3d 20 31 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  = 1;.    zFilena
2a8c0 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  me = 0;.  }.#end
2a8d0 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  if..  /* Compute
2a8e0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66   and store the f
2a8f0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  ull pathname in 
2a900 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  an allocated buf
2a910 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a  fer pointed.  **
2a920 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65   to by zPathname
2a930 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61  , length nPathna
2a940 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  me. Or, if this 
2a950 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2a960 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20  ile,.  ** leave 
2a970 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61  both nPathname a
2a980 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74  nd zPathname set
2a990 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66   to 0..  */.  if
2a9a0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2a9b0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2a9c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2a9d0 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ;.    nPathname 
2a9e0 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
2a9f0 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
2aa00 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
2aa10 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29  loc(nPathname*2)
2aa20 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
2aa30 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
2aa40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2aa50 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  MEM;.    }.    z
2aa60 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
2aa70 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
2aa80 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
2aa90 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
2aaa0 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63   fails */.    rc
2aab0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
2aac0 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
2aad0 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
2aae0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
2aaf0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2ab00 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2ab10 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2ab20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69   z = zUri = &zFi
2ab30 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74  lename[sqlite3St
2ab40 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
2ab50 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
2ab60 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b   *z ){.      z +
2ab70 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2ab80 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20  0(z)+1;.      z 
2ab90 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
2aba0 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20  30(z)+1;.    }. 
2abb0 20 20 20 6e 55 72 69 20 3d 20 26 7a 5b 31 5d 20     nUri = &z[1] 
2abc0 2d 20 7a 55 72 69 3b 0a 20 20 20 20 69 66 28 20  - zUri;.    if( 
2abd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2abe0 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
2abf0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
2ac00 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
2ac10 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
2ac20 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2ac30 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
2ac40 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
2ac50 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
2ac60 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
2ac70 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
2ac80 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
2ac90 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
2aca0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
2acb0 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
2acc0 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
2acd0 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
2ace0 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
2acf0 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
2ad00 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
2ad10 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
2ad20 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2ad30 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
2ad40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ad50 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2ad60 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
2ad70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2ad80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ad90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
2ada0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  thname);.      r
2adb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2adc0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
2add0 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
2ade0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
2adf0 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  e, PCache object
2ae00 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65  , the.  ** three
2ae10 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2ae20 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2ae30 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
2ae40 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
2ae50 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c  file name. The l
2ae60 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20  ayout in memory 
2ae70 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  is as follows:. 
2ae80 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67   **.  **     Pag
2ae90 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  er object       
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
2aeb0 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65  zeof(Pager) byte
2aec0 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63  s).  **     PCac
2aed0 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  he object       
2aee0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
2aef0 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2af00 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2af10 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
2af20 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20  andle           
2af30 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65   (pVfs->szOsFile
2af40 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2af50 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   Sub-journal fil
2af60 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2af70 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
2af80 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2af90 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66    Main journal f
2afa0 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2afb0 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2afc0 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2afd0 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2afe0 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2aff0 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20     (nPathname+1 
2b000 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2b010 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  Journal file nam
2b020 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2b030 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62  (nPathname+8+1 b
2b040 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74  ytes).  */.  pPt
2b050 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  r = (u8 *)sqlite
2b060 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
2b070 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2b080 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20  pPager)) +      
2b090 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
2b0a0 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  re */.    ROUND8
2b0b0 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20  (pcacheSize) +  
2b0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63           /* PCac
2b0d0 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  he object */.   
2b0e0 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2b0f0 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20  OsFile) +       
2b100 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66  /* The main db f
2b110 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ile */.    journ
2b120 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b  alFileSize * 2 +
2b130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b140 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   two journal fil
2b150 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68  es */ .    nPath
2b160 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20  name + 1 + nUri 
2b170 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69  +         /* zFi
2b180 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50  lename */.    nP
2b190 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20  athname + 8 + 1 
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b1b0 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e  zJournal */.#ifn
2b1c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b1d0 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e  WAL.    + nPathn
2b1e0 61 6d 65 20 2b 20 34 20 2b 20 31 20 20 20 20 20  ame + 4 + 1     
2b1f0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c           /* zWal
2b200 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   */.#endif.  );.
2b210 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2b220 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
2b230 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
2b240 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2b250 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
2b260 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
2b270 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
2b280 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2b290 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
2b2a0 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20   pPager =       
2b2b0 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28         (Pager*)(
2b2c0 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  pPtr);.  pPager-
2b2d0 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50  >pPCache =    (P
2b2e0 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20  Cache*)(pPtr += 
2b2f0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
2b300 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67  Pager)));.  pPag
2b310 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69  er->fd =   (sqli
2b320 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2b330 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65  += ROUND8(pcache
2b340 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72  Size));.  pPager
2b350 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  ->sjfd = (sqlite
2b360 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2b370 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2b380 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67  OsFile));.  pPag
2b390 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69  er->jfd =  (sqli
2b3a0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2b3b0 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
2b3c0 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze);.  pPager->z
2b3d0 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63  Filename =    (c
2b3e0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  har*)(pPtr += jo
2b3f0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2b400 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2b410 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
2b420 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
2b430 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2b440 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
2b450 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
2b460 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
2b470 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
2b480 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
2b490 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 74      assert( nPat
2b4a0 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70  hname>0 );.    p
2b4b0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
2b4c0 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72  =   (char*)(pPtr
2b4d0 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20   += nPathname + 
2b4e0 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d  1 + nUri);.    m
2b4f0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
2b500 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
2b510 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2b520 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2b530 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50  er->zFilename[nP
2b540 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69  athname+1], zUri
2b550 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d  , nUri);.    mem
2b560 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
2b570 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  rnal, zPathname,
2b580 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2b590 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2b5a0 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2b5b0 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  ame], "-journal"
2b5c0 2c 20 38 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 8);.    sqlite
2b5d0 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61  3FileSuffix3(pPa
2b5e0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2b5f0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2b600 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2b610 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70  E_OMIT_WAL.    p
2b620 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70  Pager->zWal = &p
2b630 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2b640 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a  nPathname+8+1];.
2b650 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2b660 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61  r->zWal, zPathna
2b670 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2b680 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2b690 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61  er->zWal[nPathna
2b6a0 6d 65 5d 2c 20 22 2d 77 61 6c 22 2c 20 34 29 3b  me], "-wal", 4);
2b6b0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65  .    sqlite3File
2b6c0 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e  Suffix3(pPager->
2b6d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2b6e0 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66  r->zWal);.#endif
2b6f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2b700 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
2b710 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73  }.  pPager->pVfs
2b720 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65   = pVfs;.  pPage
2b730 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
2b740 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70  sFlags;..  /* Op
2b750 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
2b760 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  e..  */.  if( zF
2b770 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2b780 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
2b790 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20  nt fout = 0;    
2b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7b0 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74  /* VFS flags ret
2b7c0 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29  urned by xOpen()
2b7d0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2b7e0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2b7f0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2b800 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  me, pPager->fd, 
2b810 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
2b820 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d  ;.    assert( !m
2b830 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64  emDb );.    read
2b840 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c  Only = (fout&SQL
2b850 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2b860 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  Y);..    /* If t
2b870 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63  he file was succ
2b880 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20  essfully opened 
2b890 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2b8a0 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68  ccess,.    ** ch
2b8b0 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
2b8c0 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
2b8d0 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
2b8e0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
2b8f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
2b900 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2b910 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
2b920 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  m of:.    **.   
2b930 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f   **    + SQLITE_
2b940 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2b950 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  E,.    **    + T
2b960 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
2b970 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
2b980 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
2b990 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65  *    + The large
2b9a0 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61  st page size tha
2b9b0 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  t can be written
2b9c0 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20   atomically..   
2b9d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2b9e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65  SQLITE_OK && !re
2b9f0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
2ba00 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2ba10 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
2ba20 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ert(SQLITE_DEFAU
2ba30 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51  LT_PAGE_SIZE<=SQ
2ba40 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2ba50 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
2ba60 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c     if( szPageDfl
2ba70 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  t<pPager->sector
2ba80 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2ba90 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
2baa0 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  orSize>SQLITE_MA
2bab0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2bac0 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
2bad0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2bae0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2baf0 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
2bb00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bb10 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2bb20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73  = (u32)pPager->s
2bb30 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
2bb40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
2bb50 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2bb60 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
2bb70 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69       {.        i
2bb80 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
2bb90 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2bba0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2bbb0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  fd);.        int
2bbc0 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
2bbd0 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2bbe0 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
2bbf0 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61  >>8));.        a
2bc00 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2bc10 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
2bc20 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
2bc30 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2bc40 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2bc50 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a  E_SIZE<=65536);.
2bc60 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73          for(ii=s
2bc70 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53  zPageDflt; ii<=S
2bc80 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2bc90 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d  T_PAGE_SIZE; ii=
2bca0 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20  ii*2){.         
2bcb0 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
2bcc0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
2bcd0 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20  i>>8)) ){.      
2bce0 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2bcf0 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
2bd00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2bd10 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2bd20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
2bd30 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79  * If a temporary
2bd40 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74   file is request
2bd50 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70  ed, it is not op
2bd60 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ened immediately
2bd70 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
2bd80 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20   case we accept 
2bd90 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
2bda0 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20   size and delay 
2bdb0 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  actually.    ** 
2bdc0 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  opening the file
2bdd0 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
2bde0 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65   call to OsWrite
2bdf0 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
2be00 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2be10 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e   also run for an
2be20 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2be30 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72  ase. An in-memor
2be40 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  y.    ** databas
2be50 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
2be60 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61   a temp-file tha
2be70 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
2be80 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a  en out to.    **
2be90 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61   disk and uses a
2bea0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c  n in-memory roll
2beb0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  back journal..  
2bec0 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69    */ .    tempFi
2bed0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  le = 1;.    pPag
2bee0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
2bef0 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70  ER_READER;.    p
2bf00 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45  Pager->eLock = E
2bf10 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
2bf20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76     readOnly = (v
2bf30 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
2bf40 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
2bf50 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
2bf60 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50  lowing call to P
2bf70 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
2bf80 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20  ) serves to set 
2bf90 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20  the value of .  
2bfa0 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ** Pager.pageSiz
2bfb0 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74  e and to allocat
2bfc0 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70  e the Pager.pTmp
2bfd0 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
2bfe0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2bff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2c000 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
2c010 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  mDb==0 );.    rc
2c020 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
2c030 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
2c040 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20  r, &szPageDflt, 
2c050 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
2c060 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
2c070 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
2c080 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2c090 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
2c0a0 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
2c0b0 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a  , free the .  **
2c0c0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2c0d0 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
2c0e0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2c0f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c100 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
2c110 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
2c120 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
2c130 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
2c140 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2c150 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
2c160 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2c170 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2c180 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
2c190 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ct. */.  assert(
2c1a0 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a   nExtra<1000 );.
2c1b0 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
2c1c0 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c  8(nExtra);.  sql
2c1d0 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
2c1e0 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
2c1f0 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
2c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
2c210 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
2c220 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
2c230 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
2c240 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54  ache);..  PAGERT
2c250 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
2c260 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
2c270 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
2c280 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2c290 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
2c2a0 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
2c2b0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2c2c0 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
2c2d0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2c2e0 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
2c2f0 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  al;.  pPager->no
2c300 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65  Readlock = (noRe
2c310 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
2c320 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70  ly) ?1:0;.  /* p
2c330 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
2c340 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2c350 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
2c360 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2c370 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
2c380 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2c390 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
2c3a0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2c3b0 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
2c3c0 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
2c3d0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2c3e0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
2c3f0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
2c400 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
2c410 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
2c420 4c 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a 20  LOCK; */.#if 0. 
2c430 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2c440 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46  >state == (tempF
2c450 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c  ile ? PAGER_EXCL
2c460 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e  USIVE : PAGER_UN
2c470 4c 4f 43 4b 29 20 29 3b 0a 23 65 6e 64 69 66 0a  LOCK) );.#endif.
2c480 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
2c490 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
2c4a0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2c4b0 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a  = (u8)tempFile;.
2c4c0 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
2c4d0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2c4e0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
2c4f0 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
2c500 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2c510 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2c520 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2c530 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2c540 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
2c550 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
2c560 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65  iveMode = (u8)te
2c570 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
2c580 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2c590 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
2c5a0 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
2c5b0 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d  >memDb = (u8)mem
2c5c0 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
2c5d0 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61  adOnly = (u8)rea
2c5e0 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28  dOnly;.  assert(
2c5f0 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70   useJournal || p
2c600 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2c610 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  );.  pPager->noS
2c620 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
2c630 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
2c640 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61  ->fullSync = pPa
2c650 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31  ger->noSync ?0:1
2c660 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
2c670 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e  Flags = pPager->
2c680 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 53 51 4c  noSync ? 0 : SQL
2c690 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
2c6a0 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  .  pPager->ckptS
2c6b0 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65  yncFlags = pPage
2c6c0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20  r->syncFlags;.  
2c6d0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2c6e0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
2c6f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
2c700 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
2c710 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
2c720 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2c730 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e  >nExtra = (u16)n
2c740 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d  Extra;.  pPager-
2c750 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
2c760 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
2c770 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  LT_JOURNAL_SIZE_
2c780 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28  LIMIT;.  assert(
2c790 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2c7a0 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20  fd) || tempFile 
2c7b0 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  );.  setSectorSi
2c7c0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ze(pPager);.  if
2c7d0 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  ( !useJournal ){
2c7e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2c7f0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2c800 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2c810 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
2c820 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
2c830 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
2c840 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2c850 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  DE_MEMORY;.  }. 
2c860 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73   /* pPager->xBus
2c870 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
2c880 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
2c890 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
2c8a0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2c8b0 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
2c8c0 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  nit;.  /* memset
2c8d0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
2c8e0 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
2c8f0 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 23 69  ->aHash)); */.#i
2c900 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c910 54 5f 4d 45 52 47 45 5f 53 4f 52 54 0a 20 20 69  T_MERGE_SORT.  i
2c920 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52  f( flags & PAGER
2c930 5f 53 4f 52 54 45 52 20 29 7b 0a 20 20 20 20 70  _SORTER ){.    p
2c940 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2c950 6c 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  l = 1;.    pPage
2c960 72 2d 3e 69 73 53 6f 72 74 65 72 20 3d 20 31 3b  r->isSorter = 1;
2c970 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2a  .  }.#endif..  *
2c980 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
2c990 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2c9a0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
2c9b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2c9c0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
2c9d0 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
2c9e0 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
2c9f0 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
2ca00 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
2ca10 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
2ca20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
2ca30 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
2ca40 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
2ca50 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
2ca60 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
2ca70 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
2ca80 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
2ca90 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
2caa0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2cab0 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
2cac0 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
2cad0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2cae0 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
2caf0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2cb00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2cb10 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
2cb20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
2cb30 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
2cb40 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
2cb50 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
2cb60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2cb70 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
2cb80 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2cb90 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
2cba0 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
2cbb0 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
2cbc0 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
2cbd0 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
2cbe0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
2cbf0 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
2cc00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
2cc10 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
2cc20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2cc30 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
2cc40 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
2cc50 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
2cc60 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
2cc70 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
2cc80 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
2cc90 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
2cca0 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
2ccb0 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
2ccc0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
2ccd0 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
2cce0 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
2ccf0 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
2cd00 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
2cd10 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
2cd20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2cd30 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
2cd40 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
2cd50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2cd60 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
2cd70 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
2cd80 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
2cd90 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
2cda0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
2cdb0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
2cdc0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2cdd0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2cde0 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
2cdf0 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
2ce00 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
2ce10 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
2ce20 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
2ce30 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
2ce40 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
2ce50 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
2ce60 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2ce70 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
2ce80 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
2ce90 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
2cea0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2ceb0 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
2cec0 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
2ced0 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
2cee0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2cef0 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
2cf00 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2cf10 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
2cf20 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
2cf30 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
2cf40 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2cf50 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2cf60 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
2cf70 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
2cf80 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
2cf90 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
2cfa0 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
2cfb0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
2cfc0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2cfd0 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
2cfe0 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
2cff0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
2d000 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
2d010 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
2d020 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
2d030 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2d040 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2d050 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
2d060 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2d070 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2d080 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
2d090 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
2d0a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2d0b0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
2d0c0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
2d0d0 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
2d0e0 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
2d0f0 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
2d100 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2d110 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
2d120 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2d130 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
2d140 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2d150 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2d160 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f  .  assert( jrnlO
2d170 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69  pen==0 || ( sqli
2d180 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2d190 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2d1a0 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51  r->jfd) &.    SQ
2d1b0 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
2d1c0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
2d1d0 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73  .  ));..  *pExis
2d1e0 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a  ts = 0;.  if( !j
2d1f0 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  rnlOpen ){.    r
2d200 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
2d210 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
2d220 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
2d230 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
2d240 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a  , &exists);.  }.
2d250 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d260 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
2d270 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20  .    int locked 
2d280 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2d290 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
2d2a0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2d2b0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
2d2c0 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
2d2d0 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
2d2e0 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
2d2f0 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
2d300 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
2d310 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
2d320 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
2d330 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
2d340 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
2d350 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
2d360 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
2d370 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
2d380 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
2d390 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
2d3a0 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
2d3b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
2d3c0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2d3d0 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
2d3e0 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
2d3f0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2d400 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
2d410 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
2d420 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
2d430 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
2d440 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
2d450 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
2d460 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2d470 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
2d480 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
2d490 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
2d4a0 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
2d4b0 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
2d4c0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2d4d0 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2d4e0 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
2d4f0 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
2d500 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d510 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
2d520 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
2d530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d540 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2d550 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
2d560 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
2d570 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a  /* Check the siz
2d580 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2d590 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f  e file. If it co
2d5a0 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65  nsists of 0 page
2d5b0 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  s,.      ** then
2d5c0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2d5d0 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68  nal file. See th
2d5e0 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
2d5f0 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20   above for .    
2d600 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69    ** the reasoni
2d610 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65  ng here.  Delete
2d620 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f   the obsolete jo
2d630 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72  urnal file under
2d640 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45  .      ** a RESE
2d650 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f  RVED lock to avo
2d660 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  id race conditio
2d670 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20  ns and to avoid 
2d680 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20  violating.      
2d690 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20  ** [H33020]..   
2d6a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2d6b0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
2d6c0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
2d6d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2d6e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d6f0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
2d700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2d710 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
2d720 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2d730 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63      if( pagerLoc
2d740 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
2d750 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
2d760 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d770 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
2d780 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
2d790 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
2d7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2d7b0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
2d7c0 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55  iveMode ) pagerU
2d7d0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
2d7e0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2d7f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d800 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
2d810 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2d820 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d830 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
2d840 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2d850 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
2d860 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
2d870 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
2d880 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
2d890 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2d8a0 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
2d8b0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
2d8c0 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
2d8d0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
2d8e0 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
2d8f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
2d900 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
2d910 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2d920 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
2d930 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
2d940 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
2d950 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
2d960 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
2d970 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
2d980 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d990 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2d9a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2d9b0 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
2d9c0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
2d9d0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2d9e0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
2d9f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2da00 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2da10 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2da20 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
2da30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2da40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2da50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2da60 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
2da70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2da80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2da90 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
2daa0 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
2dab0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
2dac0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2dad0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
2dae0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
2daf0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2db00 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2db10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2db20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2db30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2db40 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2db50 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2db60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2db70 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
2db80 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
2db90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2dba0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
2dbb0 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
2dbc0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
2dbd0 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
2dbe0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
2dbf0 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
2dc00 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
2dc10 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20     ** its has a 
2dc20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
2dc30 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
2dc40 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
2dc50 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
2dc60 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
2dc70 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
2dc80 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
2dc90 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
2dca0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
2dcb0 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
2dcc0 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
2dcd0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2dce0 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
2dcf0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
2dd00 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
2dd10 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
2dd20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
2dd40 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
2dd50 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
2dd60 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
2dd70 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
2dd80 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
2dd90 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
2dda0 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
2ddb0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
2ddc0 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
2ddd0 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
2dde0 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
2ddf0 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
2de00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2de10 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
2de20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2de30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2de40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2de50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2de60 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2de70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2de80 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2de90 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
2dea0 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
2deb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2dec0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2ded0 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
2dee0 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e  agerAcquire() un
2def0 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
2df00 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
2df10 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
2df20 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
2df30 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
2df40 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
2df50 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2df60 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2df70 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2df80 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
2df90 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
2dfa0 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
2dfb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2dfc0 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
2dfd0 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
2dfe0 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ly in PAGER_OPEN
2dff0 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
2e000 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
2e010 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e020 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
2e030 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
2e040 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
2e050 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
2e060 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e070 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
2e080 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
2e090 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
2e0a0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
2e0b0 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
2e0c0 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
2e0d0 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
2e0e0 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
2e0f0 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
2e100 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
2e110 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
2e120 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
2e130 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
2e140 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
2e150 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
2e160 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
2e170 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
2e180 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
2e190 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
2e1a0 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
2e1b0 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
2e1c0 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
2e1d0 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
2e1e0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2e1f0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2e200 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
2e210 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
2e220 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
2e230 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2e240 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
2e250 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
2e260 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
2e270 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
2e280 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
2e290 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
2e2a0 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
2e2b0 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
2e2c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2e2d0 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
2e2e0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
2e2f0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
2e300 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
2e310 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
2e320 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
2e330 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2e340 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2e350 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
2e360 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
2e370 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
2e380 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
2e390 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a  ournal file or .
2e3a0 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ** rolling back 
2e3b0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
2e3c0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
2e3d0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2e3e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2e3f0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
2e400 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2e410 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e420 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2e430 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2e440 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
2e450 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
2e460 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65  alled from b-tre
2e470 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20  e and only when 
2e480 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
2e490 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  * outstanding pa
2e4a0 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65  ges. This implie
2e4b0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
2e4c0 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69   state should ei
2e4d0 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45  ther.  ** be OPE
2e4e0 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41  N or READER. REA
2e4f0 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DER is only poss
2e500 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65  ible if the page
2e510 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a  r is or was in .
2e520 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
2e530 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f  ccess mode..  */
2e540 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2e550 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
2e560 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2e570 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
2e580 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
2e590 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
2e5a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2e5b0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2e5c0 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
2e5d0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
2e5e0 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45  ADER );.  if( NE
2e5f0 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61  VER(MEMDB && pPa
2e600 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b  ger->errCode) ){
2e610 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2e620 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66  errCode; }..  if
2e630 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
2e640 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
2e650 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2e660 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  OPEN ){.    int 
2e670 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  bHotJournal = 1;
2e680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2e690 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
2e6a0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d  s a hot journal-
2e6b0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  file */..    ass
2e6c0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
2e6d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e6e0 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30  r->noReadlock==0
2e6f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 72 65 61 64   || pPager->read
2e700 4f 6e 6c 79 20 29 3b 0a 0a 20 20 20 20 69 66 28  Only );..    if(
2e710 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
2e720 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
2e730 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
2e740 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
2e750 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2e760 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e780 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e790 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
2e7a0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
2e7b0 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
2e7c0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
2e7d0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
2e7e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2e7f0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
2e800 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
2e810 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
2e820 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
2e830 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2e840 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
2e850 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2e860 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
2e870 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
2e880 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
2e890 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
2e8a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  {.      rc = has
2e8b0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
2e8c0 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29  r, &bHotJournal)
2e8d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e8e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e8f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
2e900 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
2e910 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( bHotJournal ){
2e920 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  .      /* Get an
2e930 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2e940 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2e950 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
2e960 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
2e970 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
2e980 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
2e990 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
2e9a0 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
2e9b0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43  the.      ** EXC
2e9c0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
2e9d0 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
2e9e0 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
2e9f0 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  pen the.      **
2ea00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2ea10 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
2ea20 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
2ea30 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
2ea40 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
2ea50 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
2ea60 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
2ea70 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
2ea80 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  lling the .     
2ea90 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
2eaa0 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a  back..      ** .
2eab0 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
2eac0 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
2ead0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
2eae0 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
2eaf0 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f  , any.      ** o
2eb00 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74  ther process att
2eb10 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73  empting to acces
2eb20 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
2eb30 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ile will get to 
2eb40 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70  .      ** this p
2eb50 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
2eb60 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74   and fail to obt
2eb70 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
2eb80 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20  USIVE lock .    
2eb90 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
2eba0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
2ebb0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c   **.      ** Unl
2ebc0 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
2ebd0 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2ebe0 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  =exclusive mode,
2ebf0 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20   the lock is.   
2ec00 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64     ** downgraded
2ec10 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   to SHARED_LOCK 
2ec20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
2ec30 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20  tion returns..  
2ec40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2ec50 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
2ec60 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
2ec70 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
2ec80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ec90 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
2eca0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
2ecb0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20  .      /* If it 
2ecc0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
2ecd0 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65  pen and the file
2ece0 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
2ecf0 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20   open the .     
2ed00 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20   ** journal for 
2ed10 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2ed20 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20  s. Write access 
2ed30 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
2ed40 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e  use .      ** in
2ed50 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
2ed60 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
2ed70 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
2ed80 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20  be kept open .  
2ed90 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69      ** and possi
2eda0 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
2edb0 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
2edc0 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65   on. Also, write
2edd0 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a  -access .      *
2ede0 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71  * is usually req
2edf0 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a  uired to finaliz
2ee00 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e  e the journal in
2ee10 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65   journal_mode=pe
2ee20 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rsist .      ** 
2ee30 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66  mode (and also f
2ee40 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
2ee50 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65  truncate on some
2ee60 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20   systems)..     
2ee70 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
2ee80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  the journal does
2ee90 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75   not exist, it u
2eea0 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61  sually means tha
2eeb0 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a  t some .      **
2eec0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2eed0 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
2eee0 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
2eef0 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
2ef00 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65     ** this conne
2ef10 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74  ction obtained t
2ef20 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
2ef30 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20  k above. Or, it 
2ef40 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65  .      ** may me
2ef50 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65  an that the page
2ef60 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72  r was in the err
2ef70 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
2ef80 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
2ef90 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
2efa0 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2efb0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
2efc0 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
2efd0 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
2efe0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2eff0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2f000 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2f010 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2f020 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78  .        int bEx
2f030 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
2f040 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
2f050 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2f060 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  s */.        rc 
2f070 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
2f080 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s(.            p
2f090 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2f0a0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2f0b0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45  CESS_EXISTS, &bE
2f0c0 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20  xists);.        
2f0d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f0e0 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a  K && bExists ){.
2f0f0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
2f100 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
2f110 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
2f120 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
2f130 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2f140 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
2f150 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2f160 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2f170 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2f180 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2f190 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2f1a0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
2f1b0 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
2f1c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f1d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
2f1e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2f1f0 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  jfd) );.        
2f200 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f210 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49  _OK && fout&SQLI
2f220 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2f230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f240 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2f250 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
2f260 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
2f270 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
2f280 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
2f290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f2a0 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61  }. .      /* Pla
2f2b0 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
2f2c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
2f2d0 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
2f2e0 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
2f2f0 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
2f300 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
2f310 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68  . Purge the cach
2f320 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  e before.      *
2f330 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  * playing back t
2f340 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73  he hot-journal s
2f350 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20  o that we don't 
2f360 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20  end up with.    
2f370 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73    ** an inconsis
2f380 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e  tent cache.  Syn
2f390 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  c the hot journa
2f3a0 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
2f3b0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63  .      ** it bac
2f3c0 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63  k since the proc
2f3d0 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64  ess that crashed
2f3e0 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f   and left the ho
2f3f0 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
2f400 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20  ** probably did 
2f410 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20  not sync it and 
2f420 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  we are required 
2f430 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20  to always sync. 
2f440 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
2f450 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
2f460 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20  ng it back..    
2f470 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
2f480 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2f490 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  d) ){.        as
2f4a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2f4b0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
2f4c0 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
2f4d0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
2f4e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2f4f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f500 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2f510 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
2f520 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
2f530 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2f540 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
2f550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f560 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
2f570 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2f580 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
2f590 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
2f5a0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
2f5b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
2f5c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f5d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2f5e0 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
2f5f0 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
2f600 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2f610 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20  ng to open.     
2f620 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61     ** or roll ba
2f630 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
2f640 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61   while holding a
2f650 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2f660 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
2f670 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
2f680 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
2f690 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65  called before re
2f6a0 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63  turning to unloc
2f6b0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  k.        ** the
2f6c0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e   file. If the un
2f6d0 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69  lock attempt fai
2f6e0 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65  ls, then Pager.e
2f6f0 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20  Lock must be.   
2f700 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55       ** set to U
2f710 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65  NKNOWN_LOCK (see
2f720 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
2f730 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
2f740 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55  or .        ** U
2f750 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76  NKNOWN_LOCK abov
2f760 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  e for an explana
2f770 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20  tion). .        
2f780 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
2f790 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61   order to get pa
2f7a0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20  ger_unlock() to 
2f7b0 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67  do this, set Pag
2f7c0 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20  er.eState to.   
2f7d0 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52       ** PAGER_ER
2f7e0 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  ROR now. This is
2f7f0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f   not actually co
2f800 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73  unted as a trans
2f810 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ition.        **
2f820 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20   to ERROR state 
2f830 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61  in the state dia
2f840 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20  gram at the top 
2f850 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20  of this file,.  
2f860 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77        ** since w
2f870 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2f880 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67  same call to pag
2f890 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
2f8a0 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a   very.        **
2f8b0 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74   shortly transit
2f8c0 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  ion the pager ob
2f8d0 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e  ject to the OPEN
2f8e0 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a   state. Calling.
2f8f0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72          ** asser
2f900 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
2f910 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20  would fail now, 
2f920 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  as it should not
2f930 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   be possible.   
2f940 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e       ** to be in
2f950 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
2f960 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f  n there are zero
2f970 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
2f980 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  e .        ** re
2f990 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20  ferences..      
2f9a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67    */.        pag
2f9b0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2f9c0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f   rc);.        go
2f9d0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2f9e0 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
2f9f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2fa00 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2fa10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2fa20 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48  Pager->eLock==SH
2fa30 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
2fa40 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
2fa50 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2fa60 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
2fa70 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  >SHARED_LOCK).  
2fa80 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
2fa90 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
2faa0 65 6d 70 46 69 6c 65 20 0a 20 20 20 20 20 26 26  empFile .     &&
2fab0 20 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75   (pPager->pBacku
2fac0 70 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63  p || sqlite3Pcac
2fad0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
2fae0 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 29 20  er->pPCache)>0) 
2faf0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
2fb00 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
2fb10 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
2fb20 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
2fb30 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
2fb40 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
2fb50 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
2fb60 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
2fb70 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
2fb80 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
2fb90 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fba0 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
2fbb0 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
2fbc0 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  se.      ** has 
2fbd0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
2fbe0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2fbf0 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
2fc00 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  sh the.      ** 
2fc10 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  cache..      **.
2fc20 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
2fc30 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
2fc40 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
2fc50 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
2fc60 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
2fc70 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
2fc80 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
2fc90 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
2fca0 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
2fcb0 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
2fcc0 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
2fcd0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
2fce0 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
2fcf0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
2fd00 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
2fd10 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
2fd20 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
2fd30 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
2fd40 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
2fd50 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
2fd60 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
2fd70 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
2fd80 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
2fd90 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
2fda0 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
2fdb0 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
2fdc0 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
2fdd0 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
2fde0 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
2fdf0 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
2fe00 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
2fe10 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
2fe20 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  e = 0;.      cha
2fe30 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
2fe40 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
2fe50 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20  leVers)];..     
2fe60 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
2fe70 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
2fe80 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2fe90 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64  rc ) goto failed
2fea0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  ;..      if( nPa
2feb0 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ge>0 ){.        
2fec0 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
2fed0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2fee0 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
2fef0 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
2ff00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
2ff10 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
2ff20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a  &dbFileVers, siz
2ff30 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c  eof(dbFileVers),
2ff40 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66   24);.        if
2ff50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ff60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2ff70 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
2ff80 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
2ff90 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
2ffa0 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73  dbFileVers, 0, s
2ffb0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
2ffc0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ));.      }..   
2ffd0 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
2ffe0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2fff0 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
30000 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
30010 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
30020 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
30030 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
30040 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
30050 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
30060 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
30070 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
30080 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
30090 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
300a0 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
300b0 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
300c0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
300d0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
300e0 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
300f0 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23  esent(pPager);.#
30100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30110 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72  IT_WAL.    asser
30120 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d  t( pPager->pWal=
30130 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
30140 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _OK );.#endif.  
30150 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
30160 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
30170 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
30180 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
30190 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e   rc = pagerBegin
301a0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
301b0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
301c0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
301d0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
301e0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
301f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
30200 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
30210 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69  r, &pPager->dbSi
30220 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65  ze);.  }.. faile
30230 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
30240 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
30250 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
30260 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
30270 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
30280 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
30290 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
302a0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
302b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
302c0 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
302d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
302e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
302f0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
30300 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
30310 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
30320 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
30330 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
30340 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
30350 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
30360 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
30370 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
30380 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
30390 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
303a0 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
303b0 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
303c0 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
303d0 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
303e0 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
303f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
30400 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
30410 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
30420 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
30430 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
30440 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
30450 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
30460 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20  PCache)==0) ){. 
30470 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
30480 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
30490 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
304a0 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  Acquire a refere
304b0 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  nce to page numb
304c0 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72  er pgno in pager
304d0 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a   pPager (a page.
304e0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73  ** reference has
304f0 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20   type DbPage*). 
30500 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
30510 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
30520 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
30530 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
30540 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
30550 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
30560 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
30570 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
30580 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
30590 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74  in the cache, it
305a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
305b0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e  * Otherwise, a n
305c0 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69  ew page object i
305d0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
305e0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64  populated with d
305f0 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  ata.** read from
30600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30610 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  le. In some case
30620 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  s, the pcache mo
30630 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f  dule may.** choo
30640 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61  se not to alloca
30650 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  te a new page ob
30660 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75  ject and may reu
30670 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  se an existing.*
30680 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f  * object with no
30690 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
306a0 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  erences..**.** T
306b0 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
306c0 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
306d0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
306e0 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
306f0 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69  the .** first ti
30700 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
30710 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
30720 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71   If the page req
30730 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c  uested is .** al
30740 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
30750 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  he when this fun
30760 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
30770 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a   then the extra.
30780 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20  ** data is left 
30790 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74  as it was when t
307a0 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77  he page object w
307b0 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a  as last used..**
307c0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
307d0 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61  ase image is sma
307e0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
307f0 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20  quested page or 
30800 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  if a .** non-zer
30810 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65  o value is passe
30820 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65  d as the noConte
30830 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64  nt parameter and
30840 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
30850 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  ed page is not a
30860 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e  lready stored in
30870 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e   the cache, then
30880 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64   no .** actual d
30890 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e  isk read occurs.
308a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
308b0 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
308c0 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69  f the .** page i
308d0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
308e0 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a   all zeros. .**.
308f0 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
30900 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
30910 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
30920 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
30930 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
30940 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63  he page. This oc
30950 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65  curs in two sepe
30960 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a  rate scenarios:.
30970 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20  **.**   a) When 
30980 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c  reading a free-l
30990 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72  ist leaf page fr
309a0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  om the database,
309b0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20   and.**.**   b) 
309c0 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
309d0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
309e0 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65   back and we nee
309f0 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20  d to load.**    
30a00 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74    a new page int
30a10 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62  o the cache to b
30a20 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  e filled with th
30a30 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20  e data read.**  
30a40 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76      from the sav
30a50 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  epoint journal..
30a60 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
30a70 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
30a80 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e   the data return
30a90 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73  ed is zeroed ins
30aa0 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67  tead of.** being
30ab0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
30ac0 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
30ad0 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20  nally, the bits 
30ae0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
30af0 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65   to pgno in Page
30b00 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69  r.pInJournal (bi
30b10 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
30b20 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f  ready written to
30b30 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
30b40 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61  file) and the Pa
30b50 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
30b60 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
30b70 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a  s of any open.**
30b80 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
30b90 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  set. This means 
30ba0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  if the page is m
30bb0 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20  ade writable at 
30bc0 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20  any.** point in 
30bd0 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e  the future, usin
30be0 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  g a call to sqli
30bf0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c  te3PagerWrite(),
30c00 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
30c10 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75   will not be jou
30c20 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76  rnaled. This sav
30c30 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  es IO..**.** The
30c40 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
30c50 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
30c60 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
30c70 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
30c80 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
30c90 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
30ca0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
30cb0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
30cc0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
30cd0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
30ce0 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
30cf0 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
30d00 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
30d10 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
30d20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
30d30 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
30d40 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
30d50 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
30d60 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
30d70 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
30d80 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
30d90 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
30da0 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
30db0 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
30dc0 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
30dd0 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
30de0 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
30df0 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
30e00 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
30e10 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
30e20 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
30e30 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
30e40 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
30e50 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
30e60 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
30e70 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
30e80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
30e90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
30ea0 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
30eb0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
30ec0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
30ed0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
30ee0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
30ef0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
30f00 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
30f10 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
30f20 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
30f30 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
30f40 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
30f50 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
30f60 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f  oContent       /
30f70 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
30f80 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20  reading content 
30f90 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75  from disk if tru
30fa0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
30fb0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
30fc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
30fd0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
30fe0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
30ff0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
31000 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
31010 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  );..  if( pgno==
31020 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
31030 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
31040 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
31050 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
31060 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
31070 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
31080 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  or immediately. 
31090 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
310a0 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67   request the pag
310b0 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68  e from the PCach
310c0 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66  e layer. */.  if
310d0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
310e0 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e!=SQLITE_OK ){.
310f0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
31100 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
31110 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
31120 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
31130 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
31140 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29  pgno, 1, ppPage)
31150 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
31160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31170 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
31180 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
31190 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74  cacheFetch() ret
311a0 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f  urned an error o
311b0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  r the.    ** pag
311c0 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69  er was already i
311d0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
311e0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
311f0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
31200 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20  .    ** Set pPg 
31210 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f  to 0 and jump to
31220 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68   the exception h
31230 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20  andler.  */.    
31240 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  pPg = 0;.    got
31250 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
31260 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  err;.  }.  asser
31270 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67  t( (*ppPage)->pg
31280 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
31290 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
312a0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
312b0 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  || (*ppPage)->pP
312c0 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  ager==0 );..  if
312d0 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
312e0 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e  ger && !noConten
312f0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
31300 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61  his case the pca
31310 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  che already cont
31320 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69  ains an initiali
31330 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20  zed copy of.    
31340 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74  ** the page. Ret
31350 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74  urn without furt
31360 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20  her ado.  */.   
31370 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50   assert( pgno<=P
31380 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26  AGER_MAX_PGNO &&
31390 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f   pgno!=PAGER_MJ_
313a0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
313b0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
313c0 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20  Pager->nHit);.  
313d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
313e0 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OK;..  }else{.  
313f0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
31400 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64  ache has created
31410 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73   a new page. Its
31420 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74   content needs t
31430 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69  o .    ** be ini
31440 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20  tialized.  */.. 
31450 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
31460 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20  ager->nMiss);.  
31470 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b    pPg = *ppPage;
31480 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
31490 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20   = pPager;..    
314a0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
314b0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
314c0 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
314d0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
314e0 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  age.    ** numbe
314f0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
31500 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73  his, or the unus
31510 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c  ed locking-page,
31520 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a   is requested. *
31530 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50  /.    if( pgno>P
31540 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
31550 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
31560 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
31570 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31580 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
31590 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
315a0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
315b0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d    }..    if( MEM
315c0 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  DB || pPager->db
315d0 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43  Size<pgno || noC
315e0 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65  ontent || !isOpe
315f0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
31600 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
31610 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
31620 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
31630 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
31640 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
31650 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
31660 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f    }.      if( no
31670 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
31680 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f     /* Failure to
31690 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e   set the bits in
316a0 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62   the InJournal b
316b0 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65  it-vectors is be
316c0 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  nign..        **
316d0 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73   It merely means
316e0 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64   that we might d
316f0 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72  o some extra wor
31700 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a  k to journal a .
31710 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
31720 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
31730 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c  ed to be journal
31740 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  ed.  Nevertheles
31750 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20  s, be sure .    
31760 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74      ** to test t
31770 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20  he case where a 
31780 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
31790 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
317a0 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20   to set .       
317b0 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62   ** a bit in a b
317c0 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20  it vector..     
317d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
317e0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
317f0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
31800 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
31810 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
31820 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54  {.          TEST
31830 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c  ONLY( rc = ) sql
31840 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
31850 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
31860 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
31870 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
31880 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
31890 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
318a0 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
318b0 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69  = ) addToSavepoi
318c0 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
318d0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
318e0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
318f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
31900 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
31910 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
31920 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
31930 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
31940 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
31950 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f  eSize);.      IO
31960 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
31970 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
31980 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
31990 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
319a0 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
319b0 67 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ger );.      rc 
319c0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
319d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
319e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
319f0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
31a00 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
31a10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
31a20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
31a30 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  sh(pPg);.  }..  
31a40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31a50 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65  ;..pager_acquire
31a60 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20  _err:.  assert( 
31a70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
31a80 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
31a90 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
31aa0 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rop(pPg);.  }.  
31ab0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
31ac0 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  sed(pPager);..  
31ad0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  *ppPage = 0;.  r
31ae0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
31af0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
31b00 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
31b10 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
31b20 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
31b30 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
31b40 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
31b50 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
31b60 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
31b70 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
31b80 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
31b90 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  e. .**.** See al
31ba0 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
31bb0 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
31bc0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
31bd0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
31be0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
31bf0 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
31c00 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
31c10 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
31c20 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
31c30 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
31c40 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
31c50 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
31c60 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
31c70 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
31c80 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
31c90 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
31ca0 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
31cb0 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
31cc0 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
31cd0 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
31ce0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
31cf0 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
31d00 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  g = 0;.  assert(
31d10 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
31d20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
31d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
31d40 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20  ger->pPCache!=0 
31d50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
31d60 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
31d70 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61  ER_READER && pPa
31d80 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
31d90 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 73 71  ER_ERROR );.  sq
31da0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
31db0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
31dc0 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29  , pgno, 0, &pPg)
31dd0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a  ;.  return pPg;.
31de0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
31df0 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63   a page referenc
31e00 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
31e10 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
31e20 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
31e30 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
31e40 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
31e50 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
31e60 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
31e70 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
31e80 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
31e90 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
31ea0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
31eb0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
31ec0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
31ed0 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f  * removed..*/.vo
31ee0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
31ef0 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
31f00 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  ){.  if( pPg ){.
31f10 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
31f20 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
31f30 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
31f40 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
31f50 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49      pagerUnlockI
31f60 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
31f70 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
31f80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
31f90 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61  alled at the sta
31fa0 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74  rt of every writ
31fb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
31fc0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72  * There must alr
31fd0 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
31fe0 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
31ff0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
32000 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68  base .** file wh
32010 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
32020 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
32030 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
32040 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
32050 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74   pPager and writ
32060 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  e a journal head
32070 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  er.** to the sta
32080 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65  rt of it. If the
32090 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
320a0 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74  vepoints, open t
320b0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
320c0 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20  * as well. This 
320d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
320e0 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a   used when the j
320f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
32100 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  eing .** opened 
32110 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62  to write a rollb
32120 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72  ack log for a tr
32130 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
32140 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68   not used .** wh
32150 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74  en opening a hot
32160 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
32170 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
32180 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
32190 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65  nal file is alre
321a0 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20  ady open (as it 
321b0 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73  may be in exclus
321c0 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68  ive mode),.** th
321d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
321e0 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a   just writes a j
321f0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
32200 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
32210 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65  e.** already ope
32220 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  n file. .**.** W
32230 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
32240 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
32250 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  s opened by this
32260 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a   function, the.*
32270 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
32280 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74  al bitvec struct
32290 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
322a0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
322b0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
322c0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
322d0 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c  sful. Otherwise,
322e0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
322f0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20  TE_NOMEM if the 
32300 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
32310 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  ate Pager.pInJou
32320 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
32330 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  ** an IO error c
32340 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f  ode if opening o
32350 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  r writing the jo
32360 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
32370 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32380 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
32390 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
323a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
323b0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
323c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323d0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
323e0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
323f0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
32400 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f  Pager->pVfs;   /
32410 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
32420 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a   vfs pointer */.
32430 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
32440 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32450 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
32460 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
32470 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
32480 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
32490 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
324a0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
324b0 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
324c0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
324d0 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
324e0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  n is a no-op.  B
324f0 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f  ut on.  ** the o
32500 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20  ther hand, this 
32510 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
32520 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72   called if we ar
32530 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a  e already in.  *
32540 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  * an error state
32550 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
32560 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
32570 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
32580 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69  r->errCode;..  i
32590 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
325a0 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
325b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
325c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
325d0 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61  E_OFF ){.    pPa
325e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
325f0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
32600 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
32610 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
32620 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
32630 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  l==0 ){.      re
32640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
32650 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  M;.    }.  .    
32660 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
32670 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
32680 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
32690 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  en. */.    if( !
326a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
326b0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
326c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
326d0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
326e0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
326f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
32700 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
32710 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
32720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32730 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
32740 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  gs =            
32750 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
32760 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72  ags to open jour
32770 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nal file */.    
32780 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
32790 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
327a0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
327b0 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
327c0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20  r->tempFile ? . 
327d0 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
327e0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
327f0 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CLOSE|SQLITE_OPE
32800 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a  N_TEMP_JOURNAL):
32810 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51  .            (SQ
32820 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
32830 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20  OURNAL).        
32840 20 20 29 3b 0a 20 20 23 69 66 64 65 66 20 53 51    );.  #ifdef SQ
32850 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
32860 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
32870 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
32880 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20  rnalOpen(.      
32890 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
328a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
328b0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
328c0 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  , jrnlBufferSize
328d0 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 20  (pPager).       
328e0 20 29 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20   );.  #else.    
328f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32900 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
32910 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
32920 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
32930 73 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a  s, 0);.  #endif.
32940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
32950 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
32960 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
32970 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
32980 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a    }.  .  .    /*
32990 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74   Write the first
329a0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
329b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
329c0 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20  ile and open .  
329d0 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
329e0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
329f0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
32a00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32a10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  ){.      /* TODO
32a20 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f  : Check if all o
32a30 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c  f these are real
32a40 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  ly required. */.
32a50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
32a60 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ec = 0;.      pP
32a70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
32a80 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
32a90 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
32aa0 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
32ab0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
32ac0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
32ad0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
32ae0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
32af0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32b00 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
32b10 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
32b20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
32b30 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
32b40 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
32b50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
32b60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
32b70 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
32b80 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  ER_LOCKED );.   
32b90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
32ba0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  = PAGER_WRITER_C
32bb0 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20  ACHEMOD;.  }..  
32bc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
32bd0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74  .** Begin a writ
32be0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  e-transaction on
32bf0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
32c00 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
32c10 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e  a .** write-tran
32c20 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
32c30 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  ady been opened,
32c40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
32c50 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
32c60 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61   If the exFlag a
32c70 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65  rgument is false
32c80 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
32c90 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
32ca0 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  ED.** lock on th
32cb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
32cc0 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
32cd0 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ue, then acquire
32ce0 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20   at least.** an 
32cf0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
32d00 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
32d10 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
32d20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66  no locking .** f
32d30 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65  unctions need be
32d40 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
32d50 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
32d60 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ry argument is n
32d70 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  on-zero, then an
32d80 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70  y sub-journal op
32d90 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ened.** within t
32da0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
32db0 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61  will be opened a
32dc0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
32dd0 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73  ile. This.** has
32de0 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68   no effect if th
32df0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
32e00 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
32e10 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68  (as it may be wh
32e20 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e  en.** running in
32e30 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
32e40 20 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73   or if the trans
32e50 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  action does not 
32e60 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62  require a.** sub
32e70 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65  -journal. If the
32e80 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
32e90 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20  gument is zero, 
32ea0 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65  then any require
32eb0 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d.** sub-journal
32ec0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
32ed0 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61  in-memory if pPa
32ee0 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ger is an in-mem
32ef0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a  ory database, .*
32f00 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d  * or using a tem
32f10 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65  porary file othe
32f20 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
32f30 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
32f40 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
32f50 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73  nt exFlag, int s
32f60 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20  ubjInMemory){.  
32f70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
32f80 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  OK;..  if( pPage
32f90 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74  r->errCode ) ret
32fa0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
32fb0 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
32fc0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
32fd0 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70  AGER_READER && p
32fe0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41  Pager->eState<PA
32ff0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70  GER_ERROR );.  p
33000 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
33010 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e  ory = (u8)subjIn
33020 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41  Memory;..  if( A
33030 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53  LWAYS(pPager->eS
33040 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
33050 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ER) ){.    asser
33060 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
33070 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20  urnal==0 );..   
33080 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
33090 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
330a0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
330b0 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  r is configured 
330c0 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d  to use locking_m
330d0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61  ode=exclusive, a
330e0 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65  nd an.      ** e
330f0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
33100 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
33110 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c   not already hel
33120 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77  d, obtain it now
33130 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
33140 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
33150 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71  lusiveMode && sq
33160 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
33170 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
33180 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20  al, -1) ){.     
33190 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
331a0 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c  kDb(pPager, EXCL
331b0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
331c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
331d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
331e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
331f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33200 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
33210 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
33220 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20  >pWal, 1);.     
33230 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61   }..      /* Gra
33240 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  b the write lock
33250 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   on the log file
33260 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
33270 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20   upgrade to.    
33280 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52    ** PAGER_RESER
33290 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72  VED state. Other
332a0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
332b0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
332c0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
332d0 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64  ** The busy-hand
332e0 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b  ler is not invok
332f0 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f  ed if another co
33300 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  nnection already
33310 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  .      ** holds 
33320 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20  the write-lock. 
33330 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  If possible, the
33340 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
33350 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20  l call it..     
33360 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
33370 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
33380 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  iteTransaction(p
33390 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
333a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
333b0 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52  * Obtain a RESER
333c0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
333d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
333e0 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72  f the exFlag par
333f0 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20  ameter.      ** 
33400 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d  is true, then im
33410 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64  mediately upgrad
33420 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43  e this to an EXC
33430 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
33440 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68  .      ** busy-h
33450 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
33460 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e  can be used when
33470 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68   upgrading to th
33480 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20  e EXCLUSIVE.    
33490 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e    ** lock, but n
334a0 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e  ot when obtainin
334b0 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  g the RESERVED l
334c0 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ock..      */.  
334d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
334e0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53  ckDb(pPager, RES
334f0 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
33500 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
33510 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29  E_OK && exFlag )
33520 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
33530 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
33540 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
33550 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
33560 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
33570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33580 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  ){.      /* Chan
33590 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43  ge to WRITER_LOC
335a0 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20  KED state..     
335b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c   **.      ** WAL
335c0 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65 72   mode sets Pager
335d0 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47 45 52  .eState to PAGER
335e0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f  _WRITER_LOCKED o
335f0 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  r CACHEMOD.     
33600 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20   ** when it has 
33610 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  an open transact
33620 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74  ion, but never t
33630 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53  o DBMOD or FINIS
33640 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  HED..      ** Th
33650 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
33660 20 74 68 6f 73 65 20 73 74 61 74 65 73 20 74 68   those states th
33670 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62  e code to roll b
33680 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  ack savepoint . 
33690 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
336a0 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61  ions may copy da
336b0 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ta from the sub-
336c0 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65  journal into the
336d0 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20   database .     
336e0 20 2a 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c   ** file as well
336f0 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67   as into the pag
33700 65 20 63 61 63 68 65 2e 20 57 68 69 63 68 20 77  e cache. Which w
33710 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63  ould be incorrec
33720 74 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57  t in .      ** W
33730 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a  AL mode..      *
33740 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
33750 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
33760 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20  RITER_LOCKED;.  
33770 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
33780 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
33790 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
337a0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
337b0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
337c0 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
337d0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70  ->dbOrigSize = p
337e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
337f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
33800 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
33810 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
33820 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
33830 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
33840 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
33850 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
33860 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
33870 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
33880 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
33890 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
338a0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
338b0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
338c0 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
338d0 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25  (("TRANSACTION %
338e0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
338f0 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72  ager)));.  retur
33900 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
33910 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74  ark a single dat
33920 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
33930 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ble. The page is
33940 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
33950 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e  e .** main journ
33960 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
33970 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49  l as required. I
33980 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72  f the page is wr
33990 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e  itten into.** on
339a0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
339b0 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  s, the correspon
339c0 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
339d0 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72  in the .** Pager
339e0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
339f0 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  ec and the Pager
33a00 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
33a10 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a  epoint bitvecs.*
33a20 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61  * of any open sa
33a30 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72  vepoints as appr
33a40 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
33a50 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
33a60 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
33a70 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
33a80 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61  pPg->pData;.  Pa
33a90 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
33aa0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
33ab0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33ac0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
33ad0 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  ine is not calle
33ae0 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65  d unless a write
33af0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
33b00 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62   already .  ** b
33b10 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65  een started. The
33b20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
33b30 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
33b40 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69  open at this poi
33b50 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e  nt..  ** It is n
33b60 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74  ever called in t
33b70 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a  he ERROR state..
33b80 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
33b90 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
33ba0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
33bb0 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  ED.       || pPa
33bc0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33bd0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
33be0 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
33bf0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33c00 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
33c10 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61    );.  assert( a
33c20 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
33c30 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
33c40 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  /* If an error h
33c50 61 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  as been previous
33c60 6c 79 20 64 65 74 65 63 74 65 64 2c 20 72 65 70  ly detected, rep
33c70 6f 72 74 20 74 68 65 20 73 61 6d 65 20 65 72 72  ort the same err
33c80 6f 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 54  or.  ** again. T
33c90 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68  his should not h
33ca0 61 70 70 65 6e 2c 20 62 75 74 20 74 68 65 20 63  appen, but the c
33cb0 68 65 63 6b 20 70 72 6f 76 69 64 65 73 20 72 6f  heck provides ro
33cc0 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69  bustness. */.  i
33cd0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
33ce0 3e 65 72 72 43 6f 64 65 29 20 29 20 20 72 65 74  >errCode) )  ret
33cf0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
33d00 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65  ode;..  /* Highe
33d10 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73  r-level routines
33d20 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73   never call this
33d30 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74   function if dat
33d40 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a  abase is not.  *
33d50 2a 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74  * writable.  But
33d60 20 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a   check anyway, j
33d70 75 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  ust for robustne
33d80 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ss. */.  if( NEV
33d90 45 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  ER(pPager->readO
33da0 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53 51  nly) ) return SQ
33db0 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 43 48  LITE_PERM;..  CH
33dc0 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
33dd0 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
33de0 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
33df0 65 20 6f 70 65 6e 65 64 2e 20 48 69 67 68 65 72  e opened. Higher
33e00 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20   level routines 
33e10 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
33e20 2a 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 6e  * obtained the n
33e30 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 74  ecessary locks t
33e40 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72 69 74  o begin the writ
33e50 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  e-transaction, b
33e60 75 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c  ut the.  ** roll
33e70 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  back journal mig
33e80 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70  ht not yet be op
33e90 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20  en. Open it now 
33ea0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  if this is the c
33eb0 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ase..  **.  ** T
33ec0 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
33ed0 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  re calling sqlit
33ee0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
33ef0 79 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  y() on the page.
33f00 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
33f10 2c 20 69 66 20 69 74 20 77 65 72 65 20 64 6f 6e  , if it were don
33f20 65 20 61 66 74 65 72 20 63 61 6c 6c 69 6e 67 20  e after calling 
33f30 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
33f40 65 44 69 72 74 79 28 29 2c 20 74 68 65 6e 0a 20  eDirty(), then. 
33f50 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69 67   ** an error mig
33f60 68 74 20 6f 63 63 75 72 20 61 6e 64 20 74 68 65  ht occur and the
33f70 20 70 61 67 65 72 20 77 6f 75 6c 64 20 65 6e 64   pager would end
33f80 20 75 70 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f   up in WRITER_LO
33f90 43 4b 45 44 20 73 74 61 74 65 0a 20 20 2a 2a 20  CKED state.  ** 
33fa0 77 69 74 68 20 70 61 67 65 73 20 6d 61 72 6b 65  with pages marke
33fb0 64 20 61 73 20 64 69 72 74 79 20 69 6e 20 74 68  d as dirty in th
33fc0 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20  e cache..  */.  
33fd0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
33fe0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
33ff0 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 72  _LOCKED ){.    r
34000 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
34010 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
34020 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34030 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
34040 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
34050 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
34060 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
34070 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65  CHEMOD );.  asse
34080 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
34090 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
340a0 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
340b0 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
340c0 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
340d0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
340e0 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
340f0 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
34100 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
34110 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
34120 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
34130 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
34140 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  f( pageInJournal
34150 28 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65  (pPg) && !subjRe
34160 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
34170 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
34180 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
34190 65 72 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  er) );.  }else{.
341a0 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
341b0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
341c0 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
341d0 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
341e0 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
341f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
34200 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
34210 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
34220 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
34230 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
34240 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
34250 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
34260 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
34270 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34280 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70  !pageInJournal(p
34290 50 67 29 20 26 26 20 21 70 61 67 65 72 55 73 65  Pg) && !pagerUse
342a0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
342b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67       assert( pag
342c0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
342d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
342e0 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67   pPg->pgno<=pPag
342f0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 26  er->dbOrigSize &
34300 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
34310 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
34320 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
34330 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
34340 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4f  ;.        i64 iO
34350 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
34360 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20  rnalOff;..      
34370 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
34380 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
34390 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
343a0 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
343b0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
343c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
343d0 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  cks.  The follow
343e0 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66  ing assert verif
343f0 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ies.        ** t
34400 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
34410 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
34420 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
34430 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
34440 72 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61  r) );..        a
34450 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
34460 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65  ournalHdr<=pPage
34470 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
34480 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28  .        CODEC2(
34490 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
344a0 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
344b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
344c0 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
344d0 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
344e0 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
344f0 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20  u8*)pData2);..  
34500 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66        /* Even if
34510 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75   an IO or diskfu
34520 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ll error occurs 
34530 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  while journallin
34540 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  g the.        **
34550 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f   page in the blo
34560 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68  ck above, set th
34570 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67  e need-sync flag
34580 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20   for the page.. 
34590 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
345a0 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
345b0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
345c0 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
345d0 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  gic in.        *
345e0 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  * playback_one_p
345f0 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b  age() will think
34600 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
34610 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f  eeds to be resto
34620 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
34630 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
34640 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49  ile. And if an I
34650 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
34660 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20  hile doing so,. 
34670 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63         ** then c
34680 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f  orruption may fo
34690 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  llow..        */
346a0 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c  .        pPg->fl
346b0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
346c0 44 5f 53 59 4e 43 3b 0a 0a 20 20 20 20 20 20 20  D_SYNC;..       
346d0 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
346e0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
346f0 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  Off, pPg->pgno);
34700 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
34710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
34720 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
34730 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
34740 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
34750 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
34760 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b  >pageSize, iOff+
34770 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  4);.        if( 
34780 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
34790 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
347a0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
347b0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
347c0 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61   iOff+pPager->pa
347d0 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29  geSize+4, cksum)
347e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
347f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
34800 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
34810 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
34820 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
34830 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
34840 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
34850 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
34860 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67  journalOff, pPag
34870 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a  er->pageSize));.
34880 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e          PAGER_IN
34890 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
348a0 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a  _writej_count);.
348b0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
348c0 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE(("JOURNAL %d 
348d0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
348e0 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e  =%d hash(%08x)\n
348f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
34900 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
34910 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
34920 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
34930 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
34940 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61  D_SYNC)?1:0), pa
34950 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
34960 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 50  )));..        pP
34970 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
34980 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e   += 8 + pPager->
34990 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
349a0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
349b0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
349c0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
349d0 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
349e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
349f0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
34a00 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
34a10 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
34a20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
34a30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
34a40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
34a50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
34a60 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
34a70 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c   );.        rc |
34a80 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
34a90 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
34aa0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
34ab0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34ac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
34ad0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
34ae0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
34af0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
34b00 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
34b10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34b20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
34b30 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49  State!=PAGER_WRI
34b40 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20  TER_DBMOD ){.   
34b50 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
34b60 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
34b70 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a  SYNC;.        }.
34b80 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
34b90 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE(("APPEND %d p
34ba0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
34bb0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
34bc0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
34bd0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
34be0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
34bf0 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
34c00 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
34c10 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a  1:0)));.      }.
34c20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
34c30 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
34c40 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
34c50 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
34c60 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
34c70 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
34c80 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
34c90 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
34ca0 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
34cb0 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
34cc0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
34cd0 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
34ce0 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
34cf0 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
34d00 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
34d10 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
34d20 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
34d30 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
34d40 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
34d50 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
34d60 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
34d70 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
34d80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
34d90 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
34da0 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
34db0 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rn..  */.  if( p
34dc0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50  Pager->dbSize<pP
34dd0 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
34de0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
34df0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20  pPg->pgno;.  }. 
34e00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
34e10 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61  *.** Mark a data
34e20 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
34e30 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  le. This routine
34e40 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
34e50 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e  before .** makin
34e60 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  g changes to a p
34e70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  age. The caller 
34e80 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
34e90 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20  eturn value .** 
34ea0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
34eb0 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
34ec0 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e  not to change an
34ed0 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65  y page data unle
34ee0 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ss .** this rout
34ef0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
34f00 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE_OK..**.** The
34f10 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
34f20 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
34f30 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74  n and pager_writ
34f40 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73  e() is that this
34f50 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73  .** function als
34f60 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65  o deals with the
34f70 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
34f80 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61  ere 2 or more pa
34f90 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20  ges.** fit on a 
34fa0 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
34fb0 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  or. In this case
34fc0 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74   all co-resident
34fd0 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68   pages.** must h
34fe0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
34ff0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
35000 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75  file before retu
35010 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
35020 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
35030 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72   SQLITE_NOMEM or
35040 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
35050 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  e is returned.**
35060 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
35070 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
35080 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
35090 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
350a0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29  DbPage *pDbPage)
350b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
350c0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72  ITE_OK;..  PgHdr
350d0 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b   *pPg = pDbPage;
350e0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
350f0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
35100 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53    Pgno nPagePerS
35110 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d  ector = (pPager-
35120 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67  >sectorSize/pPag
35130 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
35140 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35150 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
35160 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
35170 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35180 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
35190 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
351a0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
351b0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
351c0 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65  ;..  if( nPagePe
351d0 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  rSector>1 ){.   
351e0 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
351f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
35200 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
35210 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
35220 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  file */.    Pgno
35230 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20   pg1;           
35240 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
35250 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
35260 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
35270 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20   on. */.    int 
35280 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20  nPage = 0;      
35290 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
352a0 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
352b0 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
352c0 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nal */.    int i
352d0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
352e0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
352f0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
35300 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20  needSync = 0;   
35310 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
35320 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50 47   any page has PG
35330 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f  HDR_NEED_SYNC */
35340 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
35350 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20   doNotSyncSpill 
35360 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20  flag to 1. This 
35370 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61  is because we ca
35380 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a  nnot allow.    *
35390 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  * a journal head
353a0 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  er to be written
353b0 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67   between the pag
353c0 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a  es journaled by.
353d0 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63      ** this func
353e0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
353f0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
35400 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
35410 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
35420 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  Spill==0 );.    
35430 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
35440 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f  cSpill++;..    /
35450 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73  * This trick ass
35460 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74  umes that both t
35470 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
35480 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65   sector-size are
35490 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  .    ** an integ
354a0 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
354b0 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
354c0 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
354d0 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  ifier.    ** of 
354e0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
354f0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
35500 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
35510 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d      */.    pg1 =
35520 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20   ((pPg->pgno-1) 
35530 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74  & ~(nPagePerSect
35540 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20  or-1)) + 1;..   
35550 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 70 50   nPageCount = pP
35560 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
35570 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
35580 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
35590 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
355a0 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
355b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
355c0 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
355d0 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
355e0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
355f0 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
35600 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
35610 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
35620 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
35630 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
35640 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
35650 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
35660 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
35670 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
35680 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
35690 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
356a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
356b0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
356c0 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
356d0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
356e0 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  ge;.      if( pg
356f0 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21  ==pPg->pgno || !
35700 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
35710 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
35720 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20  rnal, pg) ){.   
35730 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
35740 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
35750 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
35760 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35770 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
35780 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
35790 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
357a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
357b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
357c0 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
357d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
357e0 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
357f0 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
35800 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64              need
35810 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
35820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35830 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
35840 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
35850 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35860 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
35870 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67  if( (pPage = pag
35880 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
35890 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20  , pg))!=0 ){.   
358a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
358b0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
358c0 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
358d0 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
358e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
358f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
35900 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
35910 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
35920 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f  /* If the PGHDR_
35930 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
35940 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
35950 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
35960 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
35970 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69  g at pg1, then i
35980 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65  t needs to be se
35990 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  t for all of the
359a0 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a  m. Because.    *
359b0 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79  * writing to any
359c0 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20   of these nPage 
359d0 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65  pages may damage
359e0 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65   the others, the
359f0 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
35a00 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69  file must contai
35a10 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65  n sync()ed copie
35a20 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d  s of all of them
35a30 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61  .    ** before a
35a40 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62  ny of them can b
35a50 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
35a60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35a70 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
35a80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35a90 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a   && needSync ){.
35aa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d        assert( !M
35ab0 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 66 6f  EMDB );.      fo
35ac0 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
35ad0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
35ae0 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20   PgHdr *pPage = 
35af0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
35b00 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20  ger, pg1+ii);.  
35b10 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
35b20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
35b30 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  ge->flags |= PGH
35b40 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
35b50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
35b60 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
35b70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35b80 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
35b90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
35ba0 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31  oNotSyncSpill==1
35bb0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
35bc0 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d  doNotSyncSpill--
35bd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
35be0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
35bf0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
35c00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
35c10 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
35c20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
35c30 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
35c40 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
35c50 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
35c60 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
35c70 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
35c80 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
35c90 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
35ca0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
35cb0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
35cc0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
35cd0 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  BUG.int sqlite3P
35ce0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
35cf0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
35d00 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67  return pPg->flag
35d10 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d  s&PGHDR_DIRTY;.}
35d20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
35d30 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
35d40 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
35d50 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
35d60 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
35d70 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
35d80 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
35d90 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74  ge pPg back to t
35da0 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
35db0 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
35dc0 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
35dd0 64 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69  d as dirty.  Thi
35de0 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65  s happens, for e
35df0 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20  xample, when.** 
35e00 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
35e10 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61  n added as a lea
35e20 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  f of the freelis
35e30 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20  t and so its.** 
35e40 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65  content no longe
35e50 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  r matters..**.**
35e60 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
35e70 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
35e80 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
35e90 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
35ea0 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
35eb0 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
35ec0 75 73 65 64 2e 20 54 68 65 20 70 61 67 65 72 20  used. The pager 
35ed0 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
35ee0 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
35ef0 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
35f00 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
35f10 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
35f20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
35f30 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
35f40 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
35f50 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a  eed of large .**
35f60 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
35f70 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
35f80 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
35f90 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
35fa0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
35fb0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
35fc0 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
35fd0 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20  PGHDR_DIRTY) && 
35fe0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
35ff0 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47  nt==0 ){.    PAG
36000 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57  ERTRACE(("DONT_W
36010 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
36020 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
36030 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
36040 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45  )));.    IOTRACE
36050 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e  (("CLEAN %p %d\n
36060 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
36070 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e  pgno)).    pPg->
36080 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44  flags |= PGHDR_D
36090 4f 4e 54 5f 57 52 49 54 45 3b 0a 20 20 20 20 70  ONT_WRITE;.    p
360a0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
360b0 68 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  h(pPg);.  }.}../
360c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
360d0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
360e0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
360f0 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ue of the databa
36100 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e  se file .** chan
36110 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72  ge-counter, stor
36120 65 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62  ed as a 4-byte b
36130 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
36140 72 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a  r starting at .*
36150 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  * byte offset 24
36160 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
36170 6c 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 61  le.  The seconda
36180 72 79 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ry change counte
36190 72 20 61 74 0a 2a 2a 20 39 32 20 69 73 20 61 6c  r at.** 92 is al
361a0 73 6f 20 75 70 64 61 74 65 64 2c 20 61 73 20 69  so updated, as i
361b0 73 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72  s the SQLite ver
361c0 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f  sion number at o
361d0 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20  ffset 96..**.** 
361e0 42 75 74 20 74 68 69 73 20 6f 6e 6c 79 20 68 61  But this only ha
361f0 70 70 65 6e 73 20 69 66 20 74 68 65 20 70 50 61  ppens if the pPa
36200 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
36210 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 66 61 6c  Done flag is fal
36220 73 65 2e 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  se..** To avoid 
36230 65 78 63 65 73 73 20 63 68 75 72 6e 69 6e 67 20  excess churning 
36240 6f 66 20 70 61 67 65 20 31 2c 20 74 68 65 20 75  of page 1, the u
36250 70 64 61 74 65 20 6f 6e 6c 79 20 68 61 70 70 65  pdate only happe
36260 6e 73 20 6f 6e 63 65 2e 0a 2a 2a 20 53 65 65 20  ns once..** See 
36270 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 77  also the pager_w
36280 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
36290 65 72 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61  er() routine tha
362a0 74 20 64 6f 65 73 20 61 6e 20 0a 2a 2a 20 75 6e  t does an .** un
362b0 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61  conditional upda
362c0 74 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  te of the change
362d0 20 63 6f 75 6e 74 65 72 73 2e 0a 2a 2a 0a 2a 2a   counters..**.**
362e0 20 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74   If the isDirect
362f0 4d 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72  Mode flag is zer
36300 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  o, then this is 
36310 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
36320 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
36330 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20  Write() on page 
36340 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e  1, then modifyin
36350 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
36360 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61  f the.** page da
36370 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ta. In this case
36380 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   the file will b
36390 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74  e updated when t
363a0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72  he current.** tr
363b0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
363c0 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
363d0 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66  e isDirectMode f
363e0 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  lag may only be 
363f0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
36400 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70  library was comp
36410 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  iled.** with the
36420 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
36430 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72  TOMIC_WRITE macr
36440 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68  o defined. In th
36450 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69  is case,.** if i
36460 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a  sDirect is non-z
36470 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61  ero, then the da
36480 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
36490 70 64 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a  pdated directly.
364a0 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e  ** by writing an
364b0 20 75 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e   updated version
364c0 20 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e 67   of page 1 using
364d0 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a   a call to the .
364e0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  ** sqlite3OsWrit
364f0 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  e() function..*/
36500 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
36510 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
36520 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
36530 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74  er, int isDirect
36540 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Mode){.  int rc 
36550 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
36560 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36570 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
36580 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
36590 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
365a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
365b0 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a  ITER_DBMOD.  );.
365c0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
365d0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
365e0 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 44 65  ger) );..  /* De
365f0 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61  clare and initia
36600 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e  lize constant in
36610 74 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27  teger 'isDirect'
36620 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74  . If the.  ** at
36630 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
36640 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c  ization is enabl
36650 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
36660 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a  , then isDirect.
36670 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69    ** is initiali
36680 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
36690 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69   passed as the i
366a0 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61  sDirectMode para
366b0 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68  meter.  ** to th
366c0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68  is function. Oth
366d0 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c  erwise, it is al
366e0 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  ways set to zero
366f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
36700 69 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20  idea is that if 
36710 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
36720 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
36730 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65   not.  ** enable
36740 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
36750 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  e, the compiler 
36760 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73  can omit the tes
36770 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69  ts of.  ** 'isDi
36780 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20  rect' below, as 
36790 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63  well as the bloc
367a0 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68  k enclosed in th
367b0 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69  e.  ** "if( isDi
367c0 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f  rect )" conditio
367d0 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  n..  */.#ifndef 
367e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
367f0 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66  OMIC_WRITE.# def
36800 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  ine DIRECT_MODE 
36810 30 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69  0.  assert( isDi
36820 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20  rectMode==0 );. 
36830 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
36840 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b  R(isDirectMode);
36850 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
36860 44 49 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69  DIRECT_MODE isDi
36870 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a  rectMode.#endif.
36880 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
36890 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
368a0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
368b0 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  e>0 ){.    PgHdr
368c0 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20   *pPgHdr;       
368d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
368e0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
368f0 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
36900 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
36910 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  e && isOpen(pPag
36920 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20  er->fd) );..    
36930 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
36940 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
36950 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  riting. */.    r
36960 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
36970 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
36980 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73  pPgHdr);.    ass
36990 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c  ert( pPgHdr==0 |
369a0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
369b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61  );..    /* If pa
369c0 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68  ge one was fetch
369d0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
369e0 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
369f0 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a  on is not.    **
36a00 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69   operating in di
36a10 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20  rect-mode, make 
36a20 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e  page 1 writable.
36a30 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20    When not in . 
36a40 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64     ** direct mod
36a50 65 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c 77  e, page 1 is alw
36a60 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68  ays held in cach
36a70 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  e and hence the 
36a80 50 61 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a  PagerGet().    *
36a90 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79  * above is alway
36aa0 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68  s successful - h
36ab0 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53 20  ence the ALWAYS 
36ac0 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  on rc==SQLITE_OK
36ad0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
36ae0 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26   !DIRECT_MODE &&
36af0 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49   ALWAYS(rc==SQLI
36b00 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20  TE_OK) ){.      
36b10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36b20 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a  rWrite(pPgHdr);.
36b30 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
36b40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36b50 20 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 6c        /* Actuall
36b60 79 20 64 6f 20 74 68 65 20 75 70 64 61 74 65 20  y do the update 
36b70 6f 66 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  of the change co
36b80 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  unter */.      p
36b90 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
36ba0 65 63 6f 75 6e 74 65 72 28 70 50 67 48 64 72 29  ecounter(pPgHdr)
36bb0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ;..      /* If r
36bc0 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74  unning in direct
36bd0 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65   mode, write the
36be0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
36bf0 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  e 1 to the file.
36c00 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49   */.      if( DI
36c10 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20  RECT_MODE ){.   
36c20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
36c30 2a 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20 61  *zBuf;.        a
36c40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
36c50 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20  bFileSize>0 );. 
36c60 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
36c70 61 67 65 72 2c 20 70 50 67 48 64 72 2d 3e 70 44  ager, pPgHdr->pD
36c80 61 74 61 2c 20 31 2c 20 36 2c 20 72 63 3d 53 51  ata, 1, 6, rc=SQ
36c90 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 7a 42 75 66  LITE_NOMEM, zBuf
36ca0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
36cb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36cc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
36cd0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
36ce0 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
36cf0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
36d00 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
36d10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
36d20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36d30 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
36d40 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
36d50 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
36d60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36d70 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
36d80 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
36d90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
36da0 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
36db0 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
36dc0 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
36dd0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
36de0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
36df0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
36e00 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
36e10 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68  file to disk. Th
36e20 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  is is a no-op fo
36e30 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
36e40 62 61 73 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65  bases.** or page
36e50 73 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  s with the Pager
36e60 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74  .noSync flag set
36e70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
36e80 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 63 61 6c  ssful, or if cal
36e90 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66  led on a pager f
36ea0 6f 72 20 77 68 69 63 68 20 69 74 20 69 73 20 61  or which it is a
36eb0 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20   no-op, this.** 
36ec0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
36ed0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65   SQLITE_OK. Othe
36ee0 72 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72  rwise, an IO err
36ef0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
36f00 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
36f10 74 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67  te3PagerSync(Pag
36f20 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
36f30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
36f40 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
36f50 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
36f60 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
36f70 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
36f80 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
36f90 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
36fa0 63 46 6c 61 67 73 29 3b 0a 20 20 7d 65 6c 73 65  cFlags);.  }else
36fb0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
36fc0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
36fd0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
36fe0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
36ff0 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
37000 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
37010 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44 2c  TL_SYNC_OMITTED,
37020 20 28 76 6f 69 64 20 2a 29 26 72 63 29 3b 0a 20   (void *)&rc);. 
37030 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
37040 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
37050 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20  nction may only 
37060 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 20  be called while 
37070 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
37080 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 69 6e  ion is active in
37090 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66  .** rollback. If
370a0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
370b0 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20  is in WAL mode, 
370c0 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
370d0 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  o-op. .** Otherw
370e0 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e  ise, if the conn
370f0 65 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ection does not 
37100 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 6e 20  already have an 
37110 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
37120 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  n .** the databa
37130 73 65 20 66 69 6c 65 2c 20 61 6e 20 61 74 74 65  se file, an atte
37140 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
37150 62 74 61 69 6e 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  btain one..**.**
37160 20 49 66 20 74 68 65 20 45 58 43 4c 55 53 49 56   If the EXCLUSIV
37170 45 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  E lock is alread
37180 79 20 68 65 6c 64 20 6f 72 20 74 68 65 20 61 74  y held or the at
37190 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
371a0 69 74 20 69 73 0a 2a 2a 20 73 75 63 63 65 73 73  it is.** success
371b0 66 75 6c 2c 20 6f 72 20 74 68 65 20 63 6f 6e 6e  ful, or the conn
371c0 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c  ection is in WAL
371d0 20 6d 6f 64 65 2c 20 53 51 4c 49 54 45 5f 4f 4b   mode, SQLITE_OK
371e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
371f0 20 4f 74 68 65 72 77 69 73 65 2c 20 65 69 74 68   Otherwise, eith
37200 65 72 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  er SQLITE_BUSY o
37210 72 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  r an SQLITE_IOER
37220 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
37230 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
37240 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
37250 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
37260 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
37270 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
37280 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
37290 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
372a0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
372b0 43 41 43 48 45 4d 4f 44 20 0a 20 20 20 20 20 20  CACHEMOD .      
372c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
372d0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
372e0 5f 44 42 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c  _DBMOD .       |
372f0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
37300 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
37310 4f 43 4b 45 44 20 0a 20 20 29 3b 0a 20 20 61 73  OCKED .  );.  as
37320 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
37330 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
37340 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 70 61 67   );.  if( 0==pag
37350 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
37360 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
37370 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
37380 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
37390 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72  E_LOCK);.  }.  r
373a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
373b0 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
373c0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
373d0 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
373e0 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
373f0 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
37400 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
37410 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
37420 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
37430 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
37440 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
37450 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
37460 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
37470 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
37480 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
37490 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
374a0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
374b0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
374c0 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
374d0 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   that:.**.**   *
374e0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
374f0 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
37500 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  r is updated,.**
37510 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c     * the journal
37520 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65   is synced (unle
37530 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ss the atomic-wr
37540 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
37550 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20   is used),.**   
37560 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  * all dirty page
37570 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f  s are written to
37580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
37590 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20  le, .**   * the 
375a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
375b0 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20 72   truncated (if r
375c0 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a  equired), and.**
375d0 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
375e0 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a  e file synced. .
375f0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  **.** The only t
37600 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e  hing that remain
37610 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
37620 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
37630 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28  o finalize .** (
37640 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65  delete, truncate
37650 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72   or zero the fir
37660 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20  st part of) the 
37670 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
37680 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
37690 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
376a0 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
376b0 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
376c0 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
376d0 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
376e0 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
376f0 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
37700 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
37710 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
37720 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e  PhaseOne() call.
37730 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
37740 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20  nal parameter - 
37750 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65  noSync - is true
37760 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
37770 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a  ase file itself.
37780 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64  ** is not synced
37790 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
377a0 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  t call sqlite3Pa
377b0 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74  gerSync() direct
377c0 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68  ly to.** sync th
377d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
377e0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43  before calling C
377f0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
37800 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  to delete the.**
37810 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
37820 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69   this case..*/.i
37830 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
37840 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20  ommitPhaseOne(. 
37850 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
37860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37870 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
37880 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
37890 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20   *zMaster,      
378a0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
378b0 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72  NULL, the master
378c0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
378d0 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20  .  int noSync   
378e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378f0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d     /* True to om
37900 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20  it the xSync on 
37910 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29  the db file */.)
37920 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
37930 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
37940 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
37950 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
37960 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37970 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
37980 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  CKED.       || p
37990 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
379a0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
379b0 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
379c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
379d0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
379e0 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
379f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37a00 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 20 20 61  R_ERROR.  );.  a
37a10 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
37a20 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
37a30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20  ) );..  /* If a 
37a40 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63 63 75  prior error occu
37a50 72 72 65 64 2c 20 72 65 70 6f 72 74 20 74 68 61  rred, report tha
37a60 74 20 65 72 72 6f 72 20 61 67 61 69 6e 2e 20 2a  t error again. *
37a70 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
37a80 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
37a90 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
37aa0 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45  errCode;..  PAGE
37ab0 52 54 52 41 43 45 28 28 22 44 41 54 41 42 41 53  RTRACE(("DATABAS
37ac0 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
37ad0 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65  zMaster=%s nSize
37ae0 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
37af0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
37b00 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
37b10 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20  r->dbSize));..  
37b20 2f 2a 20 49 66 20 6e 6f 20 64 61 74 61 62 61 73  /* If no databas
37b30 65 20 63 68 61 6e 67 65 73 20 68 61 76 65 20 62  e changes have b
37b40 65 65 6e 20 6d 61 64 65 2c 20 72 65 74 75 72 6e  een made, return
37b50 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66 28   early. */.  if(
37b60 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
37b70 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
37b80 48 45 4d 4f 44 20 29 20 72 65 74 75 72 6e 20 53  HEMOD ) return S
37b90 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
37ba0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 2f 2a   MEMDB ){.    /*
37bb0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
37bc0 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20  n-memory db, or 
37bd0 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65  no pages have be
37be0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f  en written to, o
37bf0 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 75  r this.    ** fu
37c00 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  nction has alrea
37c10 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  dy been called, 
37c20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61 20 6e  it is mostly a n
37c30 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c 20  o-op.  However, 
37c40 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b 75  any.    ** backu
37c50 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6e 65  p in progress ne
37c60 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 61 72  eds to be restar
37c70 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
37c80 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
37c90 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
37ca0 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ckup);.  }else{.
37cb0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
37cc0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
37cd0 20 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73       PgHdr *pLis
37ce0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
37cf0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
37d00 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
37d10 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 4f     PgHdr *pPageO
37d20 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ne = 0;.      if
37d30 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
37d40 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 68 61        /* Must ha
37d50 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ve at least one 
37d60 70 61 67 65 20 66 6f 72 20 74 68 65 20 57 41 4c  page for the WAL
37d70 20 63 6f 6d 6d 69 74 20 66 6c 61 67 2e 0a 20 20   commit flag..  
37d80 20 20 20 20 20 20 2a 2a 20 54 69 63 6b 65 74 20        ** Ticket 
37d90 5b 32 64 31 61 35 63 36 37 64 66 63 32 33 36 33  [2d1a5c67dfc2363
37da0 65 34 34 66 32 39 64 39 62 62 64 35 37 66 5d 20  e44f29d9bbd57f] 
37db0 32 30 31 31 2d 30 35 2d 31 38 20 2a 2f 0a 20 20  2011-05-18 */.  
37dc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
37dd0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
37de0 72 2c 20 31 2c 20 26 70 50 61 67 65 4f 6e 65 29  r, 1, &pPageOne)
37df0 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20  ;.        pList 
37e00 3d 20 70 50 61 67 65 4f 6e 65 3b 0a 20 20 20 20  = pPageOne;.    
37e10 20 20 20 20 70 4c 69 73 74 2d 3e 70 44 69 72 74      pList->pDirt
37e20 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
37e30 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
37e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
37e50 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
37e60 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
37e70 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
37e80 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 4c 69  ames(pPager, pLi
37e90 73 74 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  st, pPager->dbSi
37ea0 7a 65 2c 20 31 2c 20 0a 20 20 20 20 20 20 20 20  ze, 1, .        
37eb0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 66 75 6c      (pPager->ful
37ec0 6c 53 79 6e 63 20 3f 20 70 50 61 67 65 72 2d 3e  lSync ? pPager->
37ed0 73 79 6e 63 46 6c 61 67 73 20 3a 20 30 29 0a 20  syncFlags : 0). 
37ee0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
37ef0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
37f00 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 4f  agerUnref(pPageO
37f10 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ne);.      if( r
37f20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
37f30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
37f40 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
37f50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
37f60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
37f70 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e{.      /* The 
37f80 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
37f90 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
37fa0 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63  ge-counter. Exac
37fb0 74 6c 79 20 68 6f 77 20 69 74 0a 20 20 20 20 20  tly how it.     
37fc0 20 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65   ** does this de
37fd0 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
37fe0 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
37ff0 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69  ic-update optimi
38000 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  zation.      ** 
38010 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
38020 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64  ompile time, and
38030 20 69 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   if this transac
38040 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20 0a  tion meets the .
38050 20 20 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65        ** runtime
38060 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73 65   criteria to use
38070 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20   the operation: 
38080 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
38090 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65  **    * The file
380a0 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
380b0 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
380c0 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20  e property for. 
380d0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f       **      blo
380e0 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
380f0 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20  -size, and .    
38100 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63    **    * This c
38110 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
38120 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
38130 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
38140 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  nd.      **    *
38150 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   Exactly one pag
38160 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
38170 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  ied and store in
38180 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
38190 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
381a0 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69    ** If the opti
381b0 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74  mization was not
381c0 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
381d0 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e 20 74  ile time, then t
381e0 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  he.      ** page
381f0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
38200 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  nter() function 
38210 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64  is called to upd
38220 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20  ate the change. 
38230 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20       ** counter 
38240 69 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64  in 'indirect-mod
38250 65 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d  e'. If the optim
38260 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69  ization is compi
38270 6c 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20 20  led in but.     
38280 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69   ** is not appli
38290 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72  cable to this tr
382a0 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20  ansaction, call 
382b0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
382c0 65 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  eate().      ** 
382d0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
382e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
382f0 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20  s actually been 
38300 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61  created, then ca
38310 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  ll.      ** page
38320 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
38330 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
38340 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
38350 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a  ter in indirect.
38360 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a        ** mode. .
38370 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
38380 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
38390 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
383a0 20 69 73 20 62 6f 74 68 20 65 6e 61 62 6c 65 64   is both enabled
383b0 20 61 6e 64 20 61 70 70 6c 69 63 61 62 6c 65 2c   and applicable,
383c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63  .      ** then c
383d0 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  all pager_incr_c
383e0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
383f0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
38400 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20  nge-counter.    
38410 20 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27    ** in 'direct'
38420 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63   mode. In this c
38430 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
38440 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  file will never 
38450 62 65 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61  be.      ** crea
38460 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61  ted for this tra
38470 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
38480 2a 2f 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  */.  #ifdef SQLI
38490 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
384a0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 50 67 48  _WRITE.      PgH
384b0 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 61  dr *pPg;.      a
384c0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
384d0 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20  ager->jfd) .    
384e0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
384f0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
38500 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
38510 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
38520 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
38530 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
38540 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
38550 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
38560 66 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20 69  f( !zMaster && i
38570 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
38580 64 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  d) .       && pP
38590 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
385a0 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  ==jrnlBufferSize
385b0 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20  (pPager) .      
385c0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
385d0 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze>=pPager->dbOr
385e0 69 67 53 69 7a 65 0a 20 20 20 20 20 20 20 26 26  igSize.       &&
385f0 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69   (0==(pPg = sqli
38600 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
38610 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
38620 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e  he)) || 0==pPg->
38630 70 44 69 72 74 79 29 0a 20 20 20 20 20 20 29 7b  pDirty).      ){
38640 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61  .        /* Upda
38650 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63  te the db file c
38660 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69  hange counter vi
38670 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72 69  a the direct-wri
38680 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a  te method. The .
3