/ Hex Artifact Content
Login

Artifact 81099edb051a46330cb4f526aaa782ac31d5f576:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76 65      0x01 /* Neve
52b0: 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20 20  r spill cache.  
52c0: 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20 2a  Set via pragma *
52d0: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
52e0: 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 20  LAG_ROLLBACK    
52f0: 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74 20  0x02 /* Current 
5300: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73 6f  rolling back, so
5310: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a 2f   do not spill */
5320: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
5330: 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20 30  AG_NOSYNC      0
5340: 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20  x04 /* Spill is 
5350: 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73  ok, but do not s
5360: 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ync */../*.** An
5370: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5380: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5390: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
53a0: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
53b0: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
53c0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
53d0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
53e0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
53f0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
5400: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
5410: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
5420: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5430: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5440: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5450: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5460: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5470: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5480: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5490: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
54a0: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
54b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
54c0: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
54d0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
54e0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
54f0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
5500: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
5510: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
5520: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5530: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5540: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5550: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5560: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5570: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5580: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5590: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
55a0: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
55b0: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
55c0: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
55d0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
55e0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
55f0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
5600: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
5610: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
5620: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5630: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5640: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5650: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5660: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5670: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5680: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5690: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
56a0: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
56b0: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
56c0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
56d0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
56e0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
56f0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
5700: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
5710: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
5720: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5730: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5740: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5750: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5760: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5770: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5780: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5790: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
57a0: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
57b0: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
57c0: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
57d0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
57e0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
57f0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
5800: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5810: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
5820: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5830: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5840: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5850: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5860: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5870: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5880: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5890: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
58a0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
58b0: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
58c0: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
58d0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
58e0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
58f0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
5900: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
5910: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
5920: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5930: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5940: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5950: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5960: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5970: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5980: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5990: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
59a0: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
59b0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
59c0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
59d0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
59e0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
59f0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
5a00: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
5a10: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
5a20: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5a30: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5a40: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5a50: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5a60: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5a70: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5a80: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5a90: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5aa0: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5ab0: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5ac0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
5ad0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
5ae0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
5af0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
5b00: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
5b10: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
5b20: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5b30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5b40: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b50: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5b60: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5b70: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5b80: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5b90: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5ba0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5bb0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5bc0: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5bd0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5be0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5bf0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5c00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5c10: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5c20: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5c30: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5c40: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5c50: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c60: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5c70: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5c80: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5c90: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5ca0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5cb0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5cc0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5cd0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5ce0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5cf0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5d00: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5d10: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5d20: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5d30: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5d40: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5d50: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5d60: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5d70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5d80: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5d90: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5da0: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5db0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5dc0: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5dd0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5de0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5df0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5e00: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5e10: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5e20: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5e30: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5e40: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5e50: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5e60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5e70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5e80: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5e90: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5ea0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5eb0: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5ec0: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5ed0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5ee0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5ef0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5f00: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5f20: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5f30: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5f40: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5f50: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5f60: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5f70: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5f80: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5f90: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5fa0: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ill.**.**   This
5fb0: 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72   variables contr
5fc0: 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ol the behavior 
5fd0: 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20  of cache-spills 
5fe0: 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a   (calls made by.
5ff0: 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20  **   the pcache 
6000: 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61  module to the pa
6010: 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74  gerStress() rout
6020: 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63  ine to write cac
6030: 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f  hed data.**   to
6040: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
6050: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65   in order to fre
6060: 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a  e up memory)..**
6070: 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20  .**   When bits 
6080: 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72  SPILLFLAG_OFF or
6090: 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
60a0: 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c  ACK of doNotSpil
60b0: 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20  l are set,.**   
60c0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
60d0: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
60e0: 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69  erStress() is di
60f0: 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65  sabled altogethe
6100: 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c  r..**   The SPIL
6110: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63  LFLAG_ROLLBACK c
6120: 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61  ase is done in a
6130: 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61   very obscure ca
6140: 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d  se that.**   com
6150: 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76  es up during sav
6160: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
6170: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
6180: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a  e pcache module.
6190: 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65  **   to allocate
61a0: 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70   a new page to p
61b0: 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e  revent the journ
61c0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
61d0: 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20  ng written.**   
61e0: 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e  while it is bein
61f0: 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63  g traversed by c
6200: 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61  ode in pager_pla
6210: 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50  yback().  The SP
6220: 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20  ILLFLAG_OFF.**  
6230: 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20   case is a user 
6240: 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a  preference..** .
6250: 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c  **   If the SPIL
6260: 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74  LFLAG_NOSYNC bit
6270: 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67   is set, writing
6280: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6290: 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65 72   from.**   pager
62a0: 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72 6d  Stress() is perm
62b0: 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69  itted, but synci
62c0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
62d0: 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20 20  ile is not..**  
62e0: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
62f0: 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
6300: 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68  rWrite() when th
6310: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65  e file-system se
6320: 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20 69  ctor-size.**   i
6330: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6340: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d  e database page-
6350: 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  size in order to
6360: 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e   prevent a journ
6370: 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72 6f  al sync.**   fro
6380: 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20 62  m happening in b
6390: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63a0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63b0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63c0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63d0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63e0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
63f0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6400: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6410: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6420: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6430: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6440: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6450: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6460: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6470: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6480: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
6490: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64a0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64b0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64c0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64d0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64e0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
64f0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6500: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6510: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6520: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6530: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6540: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6550: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6560: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6580: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
6590: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65a0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65b0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65c0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65d0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65e0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
65f0: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6600: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6610: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6620: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6630: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6640: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6650: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6660: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6670: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6680: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
6690: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66a0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66b0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66c0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66d0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66e0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
66f0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6700: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6710: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6720: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6730: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6740: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6750: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6760: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6770: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6780: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
6790: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67a0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67b0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67c0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67d0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67e0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
67f0: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6800: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6810: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6820: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6830: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6840: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6850: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6860: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6870: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6880: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
6890: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68a0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68b0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68c0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68d0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68e0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
68f0: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6900: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6910: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6920: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6930: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6940: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6950: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6960: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6970: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6980: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
6990: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69a0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69b0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69c0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69d0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69e0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
69f0: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a00: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a10: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a20: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a30: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a40: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a50: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a60: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a70: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a80: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6a90: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6aa0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ab0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ac0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ad0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6ae0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6af0: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b00: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b20: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b30: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b40: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b50: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b60: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b70: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b80: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6b90: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6ba0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bb0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bc0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6bd0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6be0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6bf0: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c00: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c10: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c20: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c30: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c40: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c50: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c60: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c70: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c80: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6c90: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6ca0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cb0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cc0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6cd0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6ce0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6cf0: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d00: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d10: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d30: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d40: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d50: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d60: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d70: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d80: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6d90: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6da0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6db0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dc0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6dd0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6de0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6df0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e00: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e10: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e20: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e30: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e40: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e50: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e60: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e70: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e80: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6e90: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6ea0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6eb0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ec0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ed0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ee0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6ef0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f00: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f10: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f20: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f30: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f40: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f50: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f60: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f70: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f80: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6f90: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fa0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fb0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fc0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fd0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6fe0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
6ff0: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7000: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7010: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7020: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7030: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7040: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7050: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7060: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7070: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7080: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
7090: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70a0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70b0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70c0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70d0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70e0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
70f0: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7100: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7110: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7120: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7130: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7140: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7150: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7160: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7170: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7180: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
7190: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71a0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71b0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71c0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71d0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71e0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
71f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7200: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7210: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7230: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7240: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7250: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7260: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7270: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7280: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
7290: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72a0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72c0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72e0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
72f0: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7310: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7320: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7330: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7340: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7350: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7360: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7370: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7380: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73a0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73b0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73c0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73d0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
73f0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7400: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7420: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7430: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7440: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7450: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7460: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7480: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
7490: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74a0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74c0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74d0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74e0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7540: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7550: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7560: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7570: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7580: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
7590: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75a0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75b0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75c0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75d0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75e0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
75f0: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7600: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7610: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7620: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7630: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7640: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7650: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7660: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7670: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7680: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
7690: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76a0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76b0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76c0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76d0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76e0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
76f0: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7700: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7710: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7740: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7750: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7760: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
7790: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77a0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77b0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77d0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77e0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
77f0: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7800: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7810: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7820: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7830: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7840: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7850: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7860: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7870: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7880: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
7890: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78b0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78c0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78d0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78e0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
78f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7900: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7910: 0a 20 20 75 38 20 68 61 73 42 65 65 6e 55 73 65  .  u8 hasBeenUse
7920: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
7930: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 63 6f  * True if any co
7940: 6e 74 65 6e 74 20 70 72 65 76 69 6f 75 73 6c 79  ntent previously
7950: 20 72 65 61 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   read */.  Pgno 
7960: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7970: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7980: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7990: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
79a0: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
79b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
79c0: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
79d0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
79e0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
79f0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7a00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7a10: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7a20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7a30: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7a40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7a50: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7a60: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7a70: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7a80: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7a90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7aa0: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7ab0: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7ac0: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7ae0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7af0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7b00: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7b10: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7b30: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7b40: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7b50: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7b60: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7b80: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7b90: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7ba0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7bb0: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7bc0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7bd0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7be0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7bf0: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
7c00: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
7c10: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7c20: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
7c30: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7c40: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
7c50: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7c60: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
7c70: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
7c80: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
7c90: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
7ca0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7cb0: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
7cc0: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
7cd0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
7ce0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
7cf0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
7d00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7d10: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d30: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
7d40: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
7d50: 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69  header */.  sqli
7d60: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
7d70: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
7d80: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
7d90: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
7da0: 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65  cesses */.  Page
7db0: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
7dc0: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
7dd0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
7de0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
7df0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
7e00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7e10: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
7e20: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
7e30: 20 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69    u32 iDataVersi
7e40: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
7e50: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
7e60: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  r database conte
7e70: 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  nt changes */.  
7e80: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
7e90: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
7ec0: 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  anges */..  int 
7ed0: 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20  nMmapOut;       
7ee0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7ef0: 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20  r of mmap pages 
7f00: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
7f10: 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nding */.  sqlit
7f20: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b  e3_int64 szMmap;
7f30: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
7f40: 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  d maximum mmap s
7f50: 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ize */.  PgHdr *
7f60: 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20  pMmapFreelist;  
7f70: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
7f80: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
7f90: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
7fa0: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
7fb0: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
7fc0: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
7fd0: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
7fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8020: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
8030: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
8040: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8050: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
8060: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
8070: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
8080: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
8090: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
80a0: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
80b0: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
80c0: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
80d0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
80e0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
80f0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
8100: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
8110: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
8120: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
8130: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
8140: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8150: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8170: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8180: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8190: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81b0: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
81c0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
81d0: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
81e0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
81f0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
8200: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
8210: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
8220: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8230: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8240: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8250: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8260: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8270: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8280: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8290: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
82a0: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
82b0: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
82c0: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
82d0: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
82e0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
82f0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
8300: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
8310: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
8320: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8330: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8340: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8350: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e   hits, misses an
8360: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
8370: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
8380: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
83a0: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
83b0: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
83c0: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
83d0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
83e0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
83f0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
8400: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
8410: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
8420: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
8430: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
8440: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
8450: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
8460: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
8470: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
8480: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
8490: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
84a0: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
84b0: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
84c0: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
84d0: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
84e0: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
84f0: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
8500: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8520: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
8530: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
8540: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
8550: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
8560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8570: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
8580: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
8590: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50  r tmp use */.  P
85a0: 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20  Cache *pPCache; 
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
85c0: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61  inter to page ca
85d0: 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69  che object */.#i
85e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
85f0: 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61  T_WAL.  Wal *pWa
8600: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8610: 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65      /* Write-ahe
8620: 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22  ad log used by "
8630: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
8640: 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61  " */.  char *zWa
8650: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8660: 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
8670: 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20  for write-ahead 
8680: 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  log */.#endif.};
8690: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20  ../*.** Indexes 
86a0: 66 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67  for use with Pag
86b0: 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20  er.aStat[]. The 
86c0: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72  Pager.aStat[] ar
86d0: 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ray contains.** 
86e0: 74 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73  the values acces
86f0: 73 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53  sed by passing S
8700: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
8710: 41 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f  ACHE_HIT, CACHE_
8720: 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48  MISS .** or CACH
8730: 45 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74  E_WRITE to sqlit
8740: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a  e3_db_status()..
8750: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
8760: 5f 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64  _STAT_HIT   0.#d
8770: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
8780: 5f 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65  _MISS  1.#define
8790: 20 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54   PAGER_STAT_WRIT
87a0: 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  E 2../*.** The f
87b0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
87c0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
87d0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
87e0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
87f0: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
8800: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
8810: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
8820: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
8830: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
8840: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
8850: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
8860: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
8870: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
8880: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
8890: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
88a0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
88b0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
88c0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
88d0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
88e0: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
88f0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
8900: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
8910: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
8920: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
8930: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
8940: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
8950: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
8960: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
8970: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
8980: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
8990: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
89a0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
89b0: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
89c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
89d0: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
89e0: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
89f0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
8a00: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
8a10: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
8a20: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
8a30: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
8a40: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
8a50: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
8a60: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
8a70: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
8a80: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
8a90: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
8aa0: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
8ab0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
8ac0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
8ad0: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
8ae0: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
8af0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
8b00: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
8b10: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
8b20: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
8b30: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
8b40: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
8b50: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
8b60: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
8b70: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
8b80: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
8b90: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
8ba0: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
8bb0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
8bc0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
8bd0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
8be0: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
8bf0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
8c00: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
8c10: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
8c20: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
8c30: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
8c40: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
8c50: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
8c60: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
8c70: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
8c80: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
8c90: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
8ca0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
8cb0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
8cc0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
8cd0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
8ce0: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
8cf0: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
8d00: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
8d10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
8d20: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
8d30: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
8d40: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
8d50: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
8d60: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
8d70: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
8d80: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
8d90: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
8da0: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
8db0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
8dc0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
8dd0: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
8de0: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
8df0: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
8e00: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
8e10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
8e20: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
8e30: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
8e40: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
8e50: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
8e60: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
8e70: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
8e80: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
8e90: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
8ea0: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
8eb0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
8ec0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
8ed0: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
8ee0: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
8ef0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
8f00: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
8f10: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
8f20: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8f30: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
8f40: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
8f50: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
8f60: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
8f70: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
8f80: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
8f90: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
8fa0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
8fb0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
8fc0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
8fd0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
8fe0: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
8ff0: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
9000: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
9010: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
9020: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
9030: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
9040: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
9050: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
9060: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
9070: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
9080: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
9090: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
90a0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
90b0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
90c0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
90d0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
90e0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
90f0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
9100: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
9110: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
9120: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
9130: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
9140: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
9150: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
9160: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
9170: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
9180: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
9190: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
91a0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
91b0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
91c0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
91d0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
91e0: 55 53 45 46 45 54 43 48 20 69 73 20 74 72 75 65  USEFETCH is true
91f0: 20 69 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77   if we are allow
9200: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 78 46  ed to use the xF
9210: 65 74 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63  etch and xUnfetc
9220: 68 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20  h.** interfaces 
9230: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
9240: 74 61 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d  tabase using mem
9250: 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a  ory-mapped I/O..
9260: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
9270: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20  X_MMAP_SIZE>0.# 
9280: 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28  define USEFETCH(
9290: 78 29 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74  x) ((x)->bUseFet
92a0: 63 68 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ch).#else.# defi
92b0: 6e 65 20 55 53 45 46 45 54 43 48 28 78 29 20 30  ne USEFETCH(x) 0
92c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
92d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
92e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
92f0: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
9300: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
9310: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
9320: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
9330: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63  ment to this mac
9340: 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73  ro is a file des
9350: 63 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71  criptor (type sq
9360: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a  lite3_file*)..**
9370: 20 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20   Return 0 if it 
9380: 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20  is not open, or 
9390: 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f  non-zero (but no
93a0: 74 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a  t 1) if it is..*
93b0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20  *.** This is so 
93c0: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73  that expressions
93d0: 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
93e0: 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  as:.**.**   if( 
93f0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
9400: 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  fd) ){ ....**.**
9410: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a   instead of.**.*
9420: 2a 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  *   if( pPager->
9430: 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  jfd->pMethods ){
9440: 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   ....*/.#define 
9450: 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46  isOpen(pFd) ((pF
9460: 64 29 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29  d)->pMethods!=0)
9470: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9480: 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65  rue if this page
9490: 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61  r uses a write-a
94a0: 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64  head log instead
94b0: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
94c0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
94d0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  l. Otherwise fal
94e0: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  se..*/.#ifndef S
94f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73  QLITE_OMIT_WAL.s
9500: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
9510: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
9520: 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ger){.  return (
9530: 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29  pPager->pWal!=0)
9540: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
9550: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
9560: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9570: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
9580: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9590: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
95a0: 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  ,y) 0.# define p
95b0: 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
95c0: 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f  sent(z) SQLITE_O
95d0: 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  K.# define pager
95e0: 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
95f0: 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f  tion(z) SQLITE_O
9600: 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  K.#endif..#ifnde
9610: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
9620: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
9630: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
9640: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
9650: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ) );.**.** This 
9660: 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61  function runs ma
9670: 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72  ny asserts to tr
9680: 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73  y to find incons
9690: 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20  istencies in.** 
96a0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
96b0: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
96c0: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
96d0: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
96e0: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
96f0: 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  p){.  Pager *pPa
9700: 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53  ger = p;..  /* S
9710: 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c  tate must be val
9720: 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  id. */.  assert(
9730: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9740: 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c  R_OPEN.       ||
9750: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9760: 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20  R_READER.       
9770: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9780: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9790: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
97a0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
97b0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
97c0: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
97d0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
97e0: 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  BMOD.       || p
97f0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9800: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a  WRITER_FINISHED.
9810: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9820: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
9830: 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61  .  );..  /* Rega
9840: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75  rdless of the cu
9850: 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74  rrent state, a t
9860: 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74  emp-file connect
9870: 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76  ion always behav
9880: 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74  es.  ** as if it
9890: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
98a0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
98b0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
98c0: 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20  never updates.  
98d0: 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ** the change-co
98e0: 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20  unter field, so 
98f0: 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
9900: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
9910: 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  ys set..  */.  a
9920: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9930: 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63  le==0 || p->eLoc
9940: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
9950: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9960: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9970: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
9980: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f  ountDone );..  /
9990: 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72  * If the useJour
99a0: 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nal flag is clea
99b0: 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  r, the journal-m
99c0: 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46  ode must be "OFF
99d0: 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20  ". .  ** And if 
99e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
99f0: 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a   is "OFF", the j
9a00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
9a10: 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   not be open..  
9a20: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9a30: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9a40: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9a50: 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72  FF || p->useJour
9a60: 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
9a70: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21   p->journalMode!
9a80: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9a90: 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65  DE_OFF || !isOpe
9aa0: 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  n(p->jfd) );..  
9ab0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45  /* Check that ME
9ac0: 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79  MDB implies noSy
9ad0: 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65  nc. And an in-me
9ae0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69  mory journal. Si
9af0: 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d  nce .  ** this m
9b00: 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eans an in-memor
9b10: 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73  y pager performs
9b20: 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69   no IO at all, i
9b30: 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74  t cannot encount
9b40: 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  er .  ** either 
9b50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
9b60: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69  SQLITE_FULL duri
9b70: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77  ng rollback or w
9b80: 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20  hile finalizing 
9b90: 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20  .  ** a journal 
9ba0: 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20  file. (although 
9bb0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  the in-memory jo
9bc0: 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61  urnal implementa
9bd0: 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72  tion may .  ** r
9be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
9bf0: 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74  RR_NOMEM while t
9c00: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9c10: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
9c20: 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74  ). It .  ** is t
9c30: 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73  herefore not pos
9c40: 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d  sible for an in-
9c50: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20  memory pager to 
9c60: 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
9c70: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a  .  ** state..  *
9c80: 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
9c90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9ca0: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
9cb0: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9cc0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9cd0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9ce0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9cf0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9d00: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
9d10: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
9d20: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
9d30: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
9d40: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
9d50: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
9d60: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
9d70: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
9d80: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
9d90: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
9da0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
9db0: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
9dc0: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
9dd0: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
9de0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9df0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
9e00: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
9e10: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9e20: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9e30: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
9e40: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
9e50: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
9e60: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
9e70: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
9e80: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
9e90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9ea0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9eb0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9ec0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9ed0: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
9ee0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
9ef0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
9f00: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
9f10: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9f20: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
9f30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9f40: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9f50: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9f60: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9f70: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9f80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9f90: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
9fa0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
9fb0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9fc0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
9fd0: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
9fe0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9ff0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a000: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a010: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a020: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a030: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a040: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a050: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a060: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a070: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
a080: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a090: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
a0a0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
a0b0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a0c0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a0d0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a0e0: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a0f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a100: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a110: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a120: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a130: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a140: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a150: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a160: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a170: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a180: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a190: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a1a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a1b0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a1c0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a1d0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a1e0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a1f0: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a200: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a210: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a220: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a230: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a240: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a250: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a260: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a270: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a280: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a290: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a2a0: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a2b0: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a2c0: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a2d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a2e0: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a2f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a300: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a310: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a320: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a330: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a340: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a350: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a360: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a380: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a390: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a3a0: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a3b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a3c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a3d0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a3e0: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a3f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a400: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a410: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a420: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a430: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a440: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a450: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a460: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a470: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a480: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a490: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a4a0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a4b0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a4c0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a4d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a4e0: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a4f0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a500: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a510: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a520: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a530: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a540: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a550: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a560: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a570: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a580: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a590: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a5a0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
a5b0: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a5c0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a5d0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a5e0: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
a5f0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a600: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a610: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a620: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a630: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a640: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a650: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
a660: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
a670: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a680: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a690: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a6a0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a6b0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a6d0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a6e0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a6f0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
a700: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a710: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
a720: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
a730: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
a740: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
a750: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
a760: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
a770: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
a780: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
a790: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
a7a0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
a7b0: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
a7c0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
a7d0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
a7e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a7f0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
a800: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a810: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
a820: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
a830: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
a840: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a850: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a870: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a880: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a890: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a8a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a8b0: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a8c0: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
a8d0: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
a8e0: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
a8f0: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
a900: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
a910: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
a920: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
a930: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
a940: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
a950: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
a960: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
a970: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
a980: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
a990: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
a9a0: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
a9b0: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
a9c0: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
a9d0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
a9e0: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
a9f0: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
aa00: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
aa10: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
aa20: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
aa30: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
aa40: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
aa50: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
aa60: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
aa70: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
aa80: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
aa90: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
aaa0: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
aab0: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
aac0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
aad0: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
aae0: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
aaf0: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
ab00: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
ab10: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
ab20: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
ab30: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
ab40: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
ab50: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
ab60: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
ab70: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
ab80: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
ab90: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
aba0: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
abb0: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
abc0: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
abd0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
abe0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
abf0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
ac00: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
ac10: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
ac20: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
ac30: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
ac40: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ac50: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ac60: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
ac70: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
ac80: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ac90: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
aca0: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
acb0: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
acc0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
acd0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
ace0: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
acf0: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
ad00: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
ad10: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
ad20: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
ad30: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
ad40: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
ad50: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
ad60: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
ad70: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
ad80: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
ad90: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
ada0: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
adb0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
adc0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
add0: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
ade0: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
adf0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
ae00: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
ae10: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
ae20: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
ae30: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
ae40: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
ae50: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
ae60: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
ae70: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
ae80: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
ae90: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
aea0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
aeb0: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
aec0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aed0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
aee0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
aef0: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
af00: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
af10: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
af20: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
af30: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
af40: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
af50: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
af60: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
af70: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
af80: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
af90: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
afa0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
afb0: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
afc0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
afd0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
afe0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
aff0: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
b000: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
b010: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
b020: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
b030: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
b040: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
b050: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
b060: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
b070: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
b080: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
b090: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
b0a0: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
b0b0: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
b0c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b0d0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
b0e0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
b0f0: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
b100: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b110: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
b120: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
b130: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
b140: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
b150: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
b160: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
b170: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
b180: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
b190: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b1a0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
b1b0: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
b1c0: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
b1d0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
b1e0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
b1f0: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
b200: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
b210: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
b220: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b230: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b240: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b250: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b260: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
b270: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
b280: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
b290: 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  p;.  Pgno pgno =
b2a0: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e   pPg->pgno;.  in
b2b0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
b2c0: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
b2d0: 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oint; i++){.    
b2e0: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
b2f0: 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20  vepoint[i];.    
b300: 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67  if( p->nOrig>=pg
b310: 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  no && 0==sqlite3
b320: 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
b330: 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  l(p->pInSavepoin
b340: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
b350: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b360: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b370: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
b380: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
b390: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b3a0: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b3b0: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b3c0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b3d0: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b3e0: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
b3f0: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
b400: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b410: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
b420: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
b430: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64  g->pgno);.}.#end
b440: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
b450: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b460: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
b470: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b480: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
b490: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
b4a0: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
b4b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
b4c0: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
b4d0: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
b4e0: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b4f0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b500: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
b510: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
b520: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
b530: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
b540: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
b550: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
b560: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
b570: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
b580: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
b590: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
b5a0: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
b5b0: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
b5c0: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
b5d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b5e0: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
b5f0: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
b600: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b610: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b620: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b630: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
b640: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
b650: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
b660: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
b670: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
b680: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
b690: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  ).../*.** Write 
b6a0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b6b0: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
b6c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
b6d0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
b6e0: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
b6f0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
b700: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
b710: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
b720: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
b730: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b740: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b750: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
b760: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
b770: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
b780: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
b790: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
b7a0: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
b7b0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
b7c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
b7d0: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
b7e0: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
b7f0: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f  her NO_LOCK.** o
b800: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52  r SHARED_LOCK. R
b810: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
b820: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
b830: 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28  call to xUnlock(
b840: 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73  ).** succeeds, s
b850: 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f  et the Pager.eLo
b860: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d  ck variable to m
b870: 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70  atch the (attemp
b880: 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a  ted) new lock..*
b890: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b8a0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b8b0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
b8c0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
b8d0: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
b8e0: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
b8f0: 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f  y it. See the co
b900: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
b910: 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55  #define of .** U
b920: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
b930: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
b940: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
b950: 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63  c int pagerUnloc
b960: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
b970: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
b980: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
b990: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
b9a0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
b9b0: 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
b9c0: 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29  ->eLock==eLock )
b9d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
b9e0: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  k==NO_LOCK || eL
b9f0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ba00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
ba10: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
ba20: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
ba30: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  er)==0 );.  if( 
ba40: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
ba50: 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
ba60: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
ba70: 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63  =eLock );.    rc
ba80: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63   = pPager->noLoc
ba90: 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  k ? SQLITE_OK : 
baa0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
bab0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63  pPager->fd, eLoc
bac0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  k);.    if( pPag
bad0: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f  er->eLock!=UNKNO
bae0: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  WN_LOCK ){.     
baf0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
bb00: 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20   (u8)eLock;.    
bb10: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
bb20: 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  UNLOCK %p %d\n",
bb30: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
bb40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bb50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
bb60: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
bb70: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
bb80: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
bb90: 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f  either SHARED_LO
bba0: 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f  CK,.** RESERVED_
bbb0: 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56  LOCK or EXCLUSIV
bbc0: 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63  E_LOCK. If the c
bbd0: 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73  aller is success
bbe0: 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20  ful, set the.** 
bbf0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
bc00: 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20  able to the new 
bc10: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a  locking state. .
bc20: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
bc30: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
bc40: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
bc50: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
bc60: 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61  nction is .** ca
bc70: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
bc80: 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68  ify it unless th
bc90: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
bca0: 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45  ate is EXCLUSIVE
bcb0: 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74  _LOCK. .** See t
bcc0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
bcd0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
bce0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
bcf0: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
bd00: 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  .** of this..*/.
bd10: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
bd20: 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  LockDb(Pager *pP
bd30: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
bd40: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
bd50: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
bd60: 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  t( eLock==SHARED
bd70: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
bd80: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
bd90: 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
bda0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  E_LOCK );.  if( 
bdb0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c  pPager->eLock<eL
bdc0: 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ock || pPager->e
bdd0: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
bde0: 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  CK ){.    rc = p
bdf0: 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20  Pager->noLock ? 
be00: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
be10: 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
be20: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
be30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
be40: 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e  _OK && (pPager->
be50: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
be60: 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  OCK||eLock==EXCL
be70: 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20  USIVE_LOCK) ){. 
be80: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
be90: 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a  ck = (u8)eLock;.
bea0: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
beb0: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
bec0: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
bed0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
bee0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
bef0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
bf00: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
bf10: 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
bf20: 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
bf30: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75  tion.** can be u
bf40: 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61  sed with this pa
bf50: 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a  ger. The optimiz
bf60: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
bf70: 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29  d if:.**.**  (a)
bf80: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
bf90: 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43  ned by OsDeviceC
bfa0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29  haracteristics()
bfb0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a   indicates that.
bfc0: 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61  **      a databa
bfd0: 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77  se page may be w
bfe0: 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
bff0: 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74  y, and.**  (b) t
c000: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c010: 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a  d by OsSectorSiz
c020: 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  e() is less than
c030: 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20   or equal.**    
c040: 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69    to the page si
c050: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  ze..**.** The op
c060: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c  timization is al
c070: 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65  so always enable
c080: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
c090: 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20  files. It is.** 
c0a0: 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c  an error to call
c0b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c0c0: 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e  f pPager is open
c0d0: 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed on an in-memo
c0e0: 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  ry.** database..
c0f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
c100: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
c110: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
c120: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
c130: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
c140: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
c150: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
c160: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
c170: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
c180: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
c190: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
c1a0: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
c1b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c1c0: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
c1d0: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
c1e0: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
c1f0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c200: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
c210: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
c220: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
c230: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
c260: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
c270: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b      int nSector;
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c290: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
c2a0: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  size */.    int 
c2b0: 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  szPage;         
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c2d0: 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   Page size */.. 
c2e0: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
c2f0: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
c300: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
c310: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
c320: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
c330: 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f  >fd);.    nSecto
c340: 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74  r = pPager->sect
c350: 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61  orSize;.    szPa
c360: 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
c370: 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65  eSize;..    asse
c380: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
c390: 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
c3a0: 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >8));.    assert
c3b0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c3c0: 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
c3d0: 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  >8));.    if( 0=
c3e0: 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43  =(dc&(SQLITE_IOC
c3f0: 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67  AP_ATOMIC|(szPag
c400: 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f  e>>8)) || nSecto
c410: 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20  r>szPage) ){.   
c420: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c430: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c440: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c450: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
c460: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
c470: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
c480: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
c490: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
c4a0: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
c4b0: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
c4c0: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
c4d0: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
c4e0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
c4f0: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
c500: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
c510: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
c520: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
c530: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
c540: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
c550: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
c560: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
c570: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
c580: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
c590: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
c5a0: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
c5b0: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
c5c0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
c5d0: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
c5e0: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
c5f0: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
c600: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
c610: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
c620: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
c630: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
c640: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
c650: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
c660: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
c670: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
c680: 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29   *)pPage->pData)
c690: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
c6a0: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
c6b0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
c6c0: 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48  {.  pPage->pageH
c6d0: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
c6e0: 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  hash(pPage);.}..
c6f0: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
c700: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
c710: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
c720: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
c730: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
c740: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
c750: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
c760: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
c770: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
c780: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
c790: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
c7a0: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
c7b0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
c7c0: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
c7d0: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
c7e0: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
c7f0: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
c800: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
c810: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
c820: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
c830: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
c840: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
c850: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
c860: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
c870: 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
c880: 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70  DIRTY) || pPg->p
c890: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
c8a0: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
c8b0: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
c8c0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c8d0: 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20  X,Y)  0.#define 
c8e0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58  pager_pagehash(X
c8f0: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
c900: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
c910: 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  X).#define CHECK
c920: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
c930: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
c940: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
c950: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
c960: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
c970: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
c980: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
c990: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
c9a0: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
c9b0: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
c9c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c9d0: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
c9e0: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
c9f0: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
ca00: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
ca10: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
ca20: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
ca30: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
ca40: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
ca50: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
ca60: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
ca70: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
ca80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ca90: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
caa0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
cab0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
cac0: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
cad0: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
cae0: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
caf0: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
cb00: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
cb10: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
cb20: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
cb30: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
cb40: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
cb50: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
cb60: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
cb70: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
cb80: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
cb90: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
cba0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
cbb0: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
cbc0: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
cbd0: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
cbe0: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
cbf0: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
cc00: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
cc10: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
cc20: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
cc30: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
cc40: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
cc50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
cc60: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
cc70: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
cc80: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
cc90: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
cca0: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
ccb0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
ccc0: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
ccd0: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
cce0: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
ccf0: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
cd00: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
cd10: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
cd20: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
cd30: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
cd40: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
cd50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
cd60: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
cd70: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
cd80: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
cd90: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
cda0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
cdb0: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
cdc0: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
cdd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
cde0: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
cdf0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
ce00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ce10: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
ce20: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
ce30: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
ce40: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
ce50: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
ce80: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
ceb0: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
cec0: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
ced0: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
cee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
cef0: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
cf00: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
cf10: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
cf20: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
cf30: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
cf40: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
cf50: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
cf60: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cf80: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
cf90: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
cfa0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
cfb0: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
cfc0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
cfd0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
cfe0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
cff0: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
d000: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
d010: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
d020: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
d030: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
d040: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d050: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
d060: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
d070: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
d080: 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d  ter .   || len==
d090: 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  0 .   || SQLITE_
d0a0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
d0b0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
d0c0: 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20  12, &cksum)).   
d0d0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d0e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
d0f0: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
d100: 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c   8, szJ-8)).   |
d110: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
d120: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
d130: 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  8).   || SQLITE_
d140: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
d150: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
d160: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
d170: 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20  -16-len)).  ){. 
d180: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d190: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
d1a0: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
d1b0: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
d1c0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
d1d0: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b   for(u=0; u<len;
d1e0: 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   u++){.    cksum
d1f0: 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a   -= zMaster[u];.
d200: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
d210: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
d220: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
d230: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
d240: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
d250: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
d260: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
d270: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d280: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
d290: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
d2a0: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
d2b0: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
d2c0: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
d2d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
d2e0: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
d2f0: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
d300: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
d310: 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20     */.    len = 
d320: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  0;.  }.  zMaster
d330: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
d340: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
d350: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
d360: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
d370: 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62   of the sector b
d380: 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d  oundary at or im
d390: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f  mediately .** fo
d3a0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75  llowing the valu
d3b0: 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e in pPager->jou
d3c0: 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e  rnalOff, assumin
d3d0: 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73  g a sector .** s
d3e0: 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73  ize of pPager->s
d3f0: 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e  ectorSize bytes.
d400: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
d410: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
d420: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  512:.**.**   Pag
d430: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20  er.journalOff   
d440: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61         Return va
d450: 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  lue.**   -------
d460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d480: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20  0.**   512      
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20   512.**   100   
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30      512.**   200
d4f0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
d500: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
d510: 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f  */.static i64 jo
d520: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50  urnalHdrOffset(P
d530: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
d540: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
d550: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
d560: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
d570: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
d580: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
d590: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d5a0: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
d5b0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d5c0: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
d5d0: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
d5e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
d5f0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d600: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
d610: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
d620: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
d630: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
d640: 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  turn offset;.}..
d650: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
d660: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
d670: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
d680: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
d690: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
d6a0: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
d6b0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
d6c0: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
d6d0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  n written to.** 
d6e0: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
d6f0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  nt transaction (
d700: 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f  i.e. if Pager.jo
d710: 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a  urnalOff==0)..**
d720: 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74  .** If doTruncat
d730: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72  e is non-zero or
d740: 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e   the Pager.journ
d750: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69  alSizeLimit vari
d760: 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  able is.** set t
d770: 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  o 0, then trunca
d780: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
d790: 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ile to zero byte
d7a0: 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72  s in size. Other
d7b0: 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68  wise,.** zero th
d7c0: 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72  e 28-byte header
d7d0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
d7e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d7f0: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
d800: 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  e, .** if the pa
d810: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f  ger is not in no
d820: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63  -sync mode, sync
d830: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d840: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  e immediately .*
d850: 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20  * after writing 
d860: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74  or truncating it
d870: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72  ..**.** If Pager
d880: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
d890: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  t is set to a po
d8a0: 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f  sitive, non-zero
d8b0: 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66   value, and.** f
d8c0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75  ollowing the tru
d8d0: 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69  ncation or zeroi
d8e0: 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  ng described abo
d8f0: 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ve the size of t
d900: 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  he .** journal f
d910: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20  ile in bytes is 
d920: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
d930: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75   value, then tru
d940: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncate the.** jou
d950: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67  rnal file to Pag
d960: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
d970: 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a  mit bytes. The j
d980: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
d990: 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  .** not need to 
d9a0: 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  be synced follow
d9b0: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
d9c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
d9d0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
d9e0: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
d9f0: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
da00: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
da10: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
da20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
da30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
da40: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50  zeroJournalHdr(P
da50: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
da60: 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20  t doTruncate){. 
da70: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
da80: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
dab0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
dac0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
dad0: 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d) );.  if( pPag
dae0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
daf0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20  {.    const i64 
db00: 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d  iLimit = pPager-
db10: 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
db20: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
db30: 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a  ache of jsl */..
db40: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a      IOTRACE(("JZ
db50: 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50  EROHDR %p\n", pP
db60: 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64  ager)).    if( d
db70: 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69  oTruncate || iLi
db80: 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
db90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
dba0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
dbb0: 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  fd, 0);.    }els
dbc0: 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  e{.      static 
dbd0: 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48  const char zeroH
dbe0: 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20  dr[28] = {0};.  
dbf0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dc00: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
dc10: 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69  jfd, zeroHdr, si
dc20: 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30  zeof(zeroHdr), 0
dc30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
dc40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
dc50: 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
dc60: 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
dc70: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
dc80: 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
dc90: 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c  E_SYNC_DATAONLY|
dca0: 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
dcb0: 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
dcc0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
dcd0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
dce0: 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74  is committed but
dcf0: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
dd00: 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
dd10: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
dd20: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
dd30: 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66   size limit conf
dd40: 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20  igured for .    
dd50: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
dd60: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t journal and th
dd70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
dd80: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65  urrently consume
dd90: 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70  s more.    ** sp
dda0: 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69  ace than that li
ddb0: 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20  mit allows for, 
ddc0: 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e  truncate it now.
ddd0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
dde0: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63  d.    ** to sync
ddf0: 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77   the file follow
de00: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
de10: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
de20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
de30: 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a   && iLimit>0 ){.
de40: 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20        i64 sz;.  
de50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
de60: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
de70: 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20  r->jfd, &sz);.  
de80: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
de90: 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d  TE_OK && sz>iLim
dea0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  it ){.        rc
deb0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
dec0: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
ded0: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
dee0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
def0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
df00: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
df10: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
df20: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
df30: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
df40: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
df50: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
df60: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
df70: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
df80: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
df90: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
dfa0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
dfb0: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
dfc0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
dfd0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
dfe0: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
dff0: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
e000: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
e010: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
e020: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
e030: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
e040: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
e050: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
e060: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
e070: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
e080: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
e090: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
e0a0: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
e0b0: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
e0c0: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
e0d0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
e0e0: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
e0f0: 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  nal..** - 4 byte
e100: 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  s: Database page
e110: 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f   size..** .** Fo
e120: 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e  llowed by (JOURN
e130: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20  AL_HDR_SZ - 28) 
e140: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
e150: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
e160: 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61   int writeJourna
e170: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
e180: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
e190: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
e1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
e1b0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63  turn code */.  c
e1c0: 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70  har *zHeader = p
e1d0: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
e1e0: 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  ;  /* Temporary 
e1f0: 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75  space used to bu
e200: 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ild header */.  
e210: 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75  u32 nHeader = (u
e220: 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
e230: 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62  ize;/* Size of b
e240: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
e250: 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20   by zHeader */. 
e260: 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20   u32 nWrite;    
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
e290: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77   header sector w
e2a0: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
e2b0: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
e2e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
e2f0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
e300: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
e310: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
e320: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66  e open. */..  if
e330: 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41  ( nHeader>JOURNA
e340: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
e350: 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
e360: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
e370: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
e380: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
e390: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
e3a0: 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68  ts and any of th
e3b0: 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20  em were created 
e3c0: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20  .  ** since the 
e3d0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72  most recent jour
e3e0: 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77  nal header was w
e3f0: 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74  ritten, update t
e400: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61  he .  ** PagerSa
e410: 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
e420: 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20  et fields now.. 
e430: 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
e440: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
e450: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
e460: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53    if( pPager->aS
e470: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
e480: 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20  rOffset==0 ){.  
e490: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
e4a0: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
e4b0: 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
e4c0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
e4d0: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
e4e0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
e4f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
e500: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
e510: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  set(pPager);..  
e520: 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74  /* .  ** Write t
e530: 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20  he nRec Field - 
e540: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
e550: 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
e560: 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a  follow this.  **
e570: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
e580: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20   Normally, zero 
e590: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
e5a0: 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73  is value at this
e5b0: 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65   time..  ** Afte
e5c0: 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72  r the records ar
e5d0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a  e added to the j
e5e0: 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20  ournal (and the 
e5f0: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20  journal synced, 
e600: 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c  .  ** if in full
e610: 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65  -sync mode), the
e620: 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69   zero is overwri
e630: 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72  tten with the tr
e640: 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f  ue number.  ** o
e650: 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73  f records (see s
e660: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20  yncJournal()).. 
e670: 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65   **.  ** A faste
e680: 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73  r alternative is
e690: 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46   to write 0xFFFF
e6a0: 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63  FFFF to the nRec
e6b0: 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a   field. When.  *
e6c0: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f  * reading the jo
e6d0: 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65  urnal this value
e6e0: 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f   tells SQLite to
e6f0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
e700: 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68  .  ** rest of th
e710: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
e720: 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61  ontains valid pa
e730: 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73  ge records. This
e740: 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a   assumption.  **
e750: 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61   is dangerous, a
e760: 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  s if a failure o
e770: 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77  ccurred whilst w
e780: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
e790: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
e7a0: 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73  it may contain s
e7b0: 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61  ome garbage data
e7c0: 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  . There are two 
e7d0: 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77  scenarios.  ** w
e7e0: 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63  here this risk c
e7f0: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20  an be ignored:. 
e800: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
e810: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  n the pager is i
e820: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
e830: 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66  Corruption can f
e840: 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20  ollow a.  **    
e850: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69   power failure i
e860: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77  n this case anyw
e870: 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ay..  **.  **   
e880: 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54  * When the SQLIT
e890: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
e8a0: 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e  END flag is set.
e8b0: 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
e8c0: 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67  .  **     that g
e8d0: 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e  arbage data is n
e8e0: 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f  ever appended to
e8f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e900: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
e910: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
e920: 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
e930: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20  noSync );.  if( 
e940: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
e950: 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
e960: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
e970: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
e980: 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  ).   || (sqlite3
e990: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
e9a0: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
e9b0: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
e9c0: 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20  _SAFE_APPEND) . 
e9d0: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
e9e0: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
e9f0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
ea00: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
ea10: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
ea20: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
ea30: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78  urnalMagic)], 0x
ea40: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c  ffffffff);.  }el
ea50: 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a  se{.    memset(z
ea60: 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Header, 0, sizeo
ea70: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ea80: 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  +4);.  }..  /* T
ea90: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
eaa0: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72  hash initializer
eab0: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72   */ .  sqlite3_r
eac0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
ead0: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
eae0: 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  it), &pPager->ck
eaf0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33  sumInit);.  put3
eb00: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
eb10: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
eb20: 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d  gic)+4], pPager-
eb30: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f  >cksumInit);.  /
eb40: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
eb50: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
eb60: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eb70: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eb80: 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50  nalMagic)+8], pP
eb90: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
eba0: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
ebb0: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
ebc0: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
ebd0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
ebe0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ebf0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
ec00: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
ec10: 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54  orSize);..  /* T
ec20: 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  he page size */.
ec30: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
ec40: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
ec50: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20  rnalMagic)+16], 
ec60: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
ec70: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
ec80: 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f  izing the tail o
ec90: 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20  f the buffer is 
eca0: 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
ecb0: 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20  Everything.  ** 
ecc0: 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68  works find if th
ecd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73  e following mems
ece0: 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e  et() is omitted.
ecf0: 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69    But initializi
ed00: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f  ng.  ** the memo
ed10: 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67  ry prevents valg
ed20: 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61  rind from compla
ed30: 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65  ining, so we are
ed40: 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a   willing to.  **
ed50: 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72   take the perfor
ed60: 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a  mance hit..  */.
ed70: 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65    memset(&zHeade
ed80: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
ed90: 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a  lMagic)+20], 0,.
eda0: 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72           nHeader
edb0: 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  -(sizeof(aJourna
edc0: 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20  lMagic)+20));.. 
edd0: 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69   /* In theory, i
ede0: 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73  t is only necess
edf0: 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
ee00: 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74   28 bytes that t
ee10: 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  he .  ** journal
ee20: 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73   header consumes
ee30: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
ee40: 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20  file here. Then 
ee50: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  increment the . 
ee60: 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   ** Pager.journa
ee70: 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79  lOff variable by
ee80: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
ee90: 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
eea0: 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73   .  ** record is
eeb0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
eec0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72  following sector
eed0: 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20   (leaving a gap 
eee0: 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a  in the file.  **
eef0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d   that will be im
ef00: 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20  plicitly filled 
ef10: 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20  in by the OS).. 
ef20: 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72   **.  ** However
ef30: 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73   it has been dis
ef40: 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20  covered that on 
ef50: 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69  some systems thi
ef60: 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20  s pattern can . 
ef70: 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61   ** be significa
ef80: 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e  ntly slower than
ef90: 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72   contiguously wr
efa0: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
efb0: 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65  e file,.  ** eve
efc0: 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
efd0: 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69  explicitly writi
efe0: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62  ng data to the b
eff0: 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a  lock of .  ** (J
f000: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
f010: 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77  28) bytes that w
f020: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
f030: 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74   So that is what
f040: 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a  .  ** is done. .
f050: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f    **.  ** The lo
f060: 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68  op is required h
f070: 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20  ere in case the 
f080: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c  sector-size is l
f090: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a  arger than the .
f0a0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61    ** database pa
f0b0: 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74  ge size. Since t
f0c0: 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65  he zHeader buffe
f0d0: 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e  r is only Pager.
f0e0: 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79  pageSize.  ** by
f0f0: 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72  tes in size, mor
f100: 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20  e than one call 
f110: 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  to sqlite3OsWrit
f120: 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69  e() may be requi
f130: 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75  red.  ** to popu
f140: 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  late the entire 
f150: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
f160: 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66  ector..  */ .  f
f170: 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d  or(nWrite=0; rc=
f180: 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69  =SQLITE_OK&&nWri
f190: 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  te<JOURNAL_HDR_S
f1a0: 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74  Z(pPager); nWrit
f1b0: 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20  e+=nHeader){.   
f1c0: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
f1d0: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
f1e0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
f1f0: 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64  ournalHdr, nHead
f200: 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  er)).    rc = sq
f210: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
f220: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
f230: 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67  r, nHeader, pPag
f240: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
f250: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
f260: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
f270: 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
f280: 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61  alOff );.    pPa
f290: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
f2a0: 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a  += nHeader;.  }.
f2b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f2c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
f2d0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
f2e0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
f2f0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
f300: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
f310: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
f320: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
f330: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
f340: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
f350: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
f360: 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20  le. The current 
f370: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
f380: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
f390: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67  given by.** pPag
f3a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20  er->journalOff. 
f3b0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
f3c0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
f3d0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
f3e0: 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69  r.** a descripti
f3f0: 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
f400: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
f410: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
f420: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
f430: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65  cessfully, *pNRe
f440: 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
f450: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
f460: 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77  e records follow
f470: 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20  ing this header 
f480: 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20  and *pDbSize is 
f490: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
f4a0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
f4b0: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
f4c0: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
f4d0: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
f4e0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
f4f0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
f500: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
f510: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f520: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
f530: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
f540: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
f550: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
f560: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
f570: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
f580: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
f590: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
f5a0: 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61  ned and *pNRec a
f5b0: 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20  nd *PDbSize are 
f5c0: 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a  undefined.  If J
f5d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
f5e0: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
f5f0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f600: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
f610: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
f620: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
f630: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
f640: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
f650: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
f660: 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
f670: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48  ect */.  int isH
f680: 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61  ot,.  i64 journa
f690: 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  lSize,          
f6a0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
f6b0: 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  e open journal f
f6c0: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
f6d0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20    u32 *pNRec,   
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f6f0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61  * OUT: Value rea
f700: 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20  d from the nRec 
f710: 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a  field */.  u32 *
f720: 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20  pDbSize         
f730: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f740: 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61  Value of origina
f750: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
f760: 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  field */.){.  in
f770: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
f780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
f790: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
f7a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
f7b0: 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41  gic[8];     /* A
f7c0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
f7d0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
f7e0: 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
f7f0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
f800: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
f810: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62  journal header b
f820: 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20  eing read */..  
f830: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
f840: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
f850: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
f860: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
f870: 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  . */..  /* Advan
f880: 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ce Pager.journal
f890: 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74  Off to the start
f8a0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63   of the next sec
f8b0: 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  tor. If the.  **
f8c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
f8d0: 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74   too small for t
f8e0: 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61  here to be a hea
f8f0: 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68  der stored at th
f900: 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72  is.  ** point, r
f910: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
f920: 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  E..  */.  pPager
f930: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
f940: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
f950: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
f960: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f970: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
f980: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
f990: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
f9a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f9b0: 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
f9c0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f9d0: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  lOff;..  /* Read
f9e0: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20   in the first 8 
f9f0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
fa00: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20  rnal header. If 
fa10: 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
fa20: 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69  h.  ** the  magi
fa30: 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61  c string found a
fa40: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
fa50: 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ach journal head
fa60: 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  er, return.  ** 
fa70: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20  SQLITE_DONE. If 
fa80: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
fa90: 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  rs, return an er
faa0: 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
fab0: 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65  ise,.  ** procee
fac0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
fad0: 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d  Hot || iHdrOff!=
fae0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
faf0: 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  dr ){.    rc = s
fb00: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
fb10: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
fb20: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
fb30: 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20  , iHdrOff);.    
fb40: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
fb50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
fb60: 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
fb70: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
fb80: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fb90: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
fba0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fbb0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
fbc0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
fbd0: 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62  first three 32-b
fbe0: 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  it fields of the
fbf0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a   journal header:
fc00: 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66   The nRec.  ** f
fc10: 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73  ield, the checks
fc20: 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61  um-initializer a
fc30: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
fc40: 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72  size at the star
fc50: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72  t.  ** of the tr
fc60: 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72  ansaction. Retur
fc70: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
fc80: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
fc90: 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   wrong..  */.  i
fca0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
fcb0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
fcc0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
fcd0: 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20  Off+8, pNRec)). 
fce0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
fcf0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
fd00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
fd10: 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65  drOff+12, &pPage
fd20: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20  r->cksumInit)). 
fd30: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
fd40: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
fd50: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
fd60: 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a  drOff+16, pDbSiz
fd70: 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  e)).  ){.    ret
fd80: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
fd90: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
fda0: 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
fdb0: 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20  u32 iPageSize;  
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fdd0: 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  Page-size field 
fde0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
fdf0: 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65  r */.    u32 iSe
fe00: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
fe10: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d        /* Sector-
fe20: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
fe30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
fe40: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
fe50: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
fe60: 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e  ector-size journ
fe70: 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73  al header fields
fe80: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c  . */.    if( SQL
fe90: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
fea0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
feb0: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30  >jfd, iHdrOff+20
fec0: 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29  , &iSectorSize))
fed0: 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  .     || SQLITE_
fee0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
fef0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
ff00: 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69  , iHdrOff+24, &i
ff10: 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29  PageSize)).    )
ff20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
ff30: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
ff40: 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   Versions of SQL
ff50: 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35  ite prior to 3.5
ff60: 2e 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d  .8 set the page-
ff70: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
ff80: 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
ff90: 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e   header to zero.
ffa0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
ffb0: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50  ssume that the P
ffc0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
ffd0: 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
ffe0: 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20   already set to 
fff0: 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
10000 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
10010 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d    if( iPageSize=
10020 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67  =0 ){.      iPag
10030 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
10040 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  pageSize;.    }.
10050 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
10060 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65  at the values re
10070 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
10080 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
10090 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20  -size fields.   
100a0 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72   ** are within r
100b0 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20  ange. To be 'in 
100c0 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c  range', both val
100d0 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61  ues need to be a
100e0 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66   power.    ** of
100f0 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61   two greater tha
10100 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31  n or equal to 51
10110 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74  2 or 32, and not
10120 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
10130 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70  eir .    ** resp
10140 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74  ective compile t
10150 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69  ime maximum limi
10160 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
10170 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32  f( iPageSize<512
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65    || iSectorSize
101a0 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67  <32.     || iPag
101b0 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
101c0 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53  _PAGE_SIZE || iS
101d0 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
101e0 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c  CTOR_SIZE.     |
101f0 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29  | ((iPageSize-1)
10200 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20  &iPageSize)!=0  
10210 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a   || ((iSectorSiz
10220 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65  e-1)&iSectorSize
10230 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
10240 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74     /* If the eit
10250 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a  her the page-siz
10260 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65  e or sector-size
10270 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   in the journal-
10280 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20  header is .     
10290 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   ** invalid, the
102a0 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  n the process th
102b0 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75  at wrote the jou
102c0 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74  rnal-header must
102d0 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20   have .      ** 
102e0 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74  crashed before t
102f0 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79  he header was sy
10300 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  nced. In this ca
10310 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  se stop reading 
10320 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
10330 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
10340 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
10360 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  NE;.    }..    /
10370 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67  * Update the pag
10380 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  e-size to match 
10390 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
103a0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  rom the journal.
103b0 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74   .    ** Use a t
103c0 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20  estcase() macro 
103d0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
103e0 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  t malloc failure
103f0 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20   within .    ** 
10400 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10410 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20  () is tested..  
10420 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
10430 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
10440 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
10450 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20  PageSize, -1);. 
10460 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
10470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
10480 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
10490 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
104a0 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
104b0 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
104c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  .    ** the proc
104d0 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
104e0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
104f0 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
10500 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  as.    ** create
10510 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f  d by a process o
10520 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f  ther than this o
10530 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ne, then this ro
10540 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20  utine.    ** is 
10550 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
10560 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
10570 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
10580 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a  ocal value.    *
10590 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
105a0 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
105b0 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
105c0 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
105d0 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
105e0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53  >sectorSize = iS
105f0 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a  ectorSize;.  }..
10600 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10610 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
10620 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
10630 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10640 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
10650 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
10660 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
10670 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
10680 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
10690 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
106a0 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
106b0 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
106c0 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
106d0 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
106e0 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
106f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
10700 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
10710 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
10720 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
10730 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10740 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
10750 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
10760 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
10770 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
10780 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
10790 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  t is:.**.**   + 
107a0 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d  4 bytes: PAGER_M
107b0 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e  J_PGNO..**   + N
107c0 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
107d0 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
107e0 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b  in utf-8..**   +
107f0 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e   4 bytes: N (len
10800 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  gth of master jo
10810 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79  urnal name in by
10820 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d  tes, no nul-term
10830 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20  inator)..**   + 
10840 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
10850 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
10860 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20  cksum..**   + 8 
10870 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
10880 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
10890 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
108a0 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
108b0 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
108c0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
108d0 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
108e0 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68  name, where each
108f0 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72   byte is interpr
10900 65 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64  eted as a signed
10910 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a   8-bit integer..
10920 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72  **.** If zMaster
10930 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
10940 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61  er (occurs for a
10950 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
10960 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a   transaction), .
10970 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  ** this call is 
10980 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
10990 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74  ic int writeMast
109a0 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  erJournal(Pager 
109b0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
109c0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
109d0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
10a00 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
10a10 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
10a20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
10a30 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74   of string zMast
10a40 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
10a50 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
10a60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
10a70 65 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20  et of header in 
10a80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
10a90 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20    i64 jrnlSize; 
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
10ac0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69  urnal file on di
10ad0 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  sk */.  u32 cksu
10ae0 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
10af0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
10b00 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a  ksum of string z
10b10 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  Master */..  ass
10b20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74  ert( pPager->set
10b30 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61  Master==0 );.  a
10b40 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
10b50 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
10b60 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a    if( !zMaster .
10b70 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
10b80 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
10b90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
10ba0 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70  ORY .   || !isOp
10bb0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a  en(pPager->jfd).
10bc0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
10bd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10be0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
10bf0 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
10c00 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
10c10 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
10c20 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20  journalOff );.. 
10c30 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68   /* Calculate th
10c40 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  e length in byte
10c50 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73  s and the checks
10c60 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f  um of zMaster */
10c70 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30  .  for(nMaster=0
10c80 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  ; zMaster[nMaste
10c90 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a  r]; nMaster++){.
10ca0 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
10cb0 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20  ster[nMaster];. 
10cc0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
10cd0 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
10ce0 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
10cf0 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
10d00 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
10d10 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
10d20 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
10d30 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
10d40 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
10d50 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
10d60 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
10d70 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
10d80 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
10d90 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
10da0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
10db0 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
10dc0 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
10dd0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  er);.  }.  iHdrO
10de0 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
10df0 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57  rnalOff;..  /* W
10e00 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
10e10 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20  journal data to 
10e20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
10e30 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a  ournal file. If.
10e40 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
10e50 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65  curs, return the
10e60 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
10e70 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a  he caller..  */.
10e80 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20    if( (0 != (rc 
10e90 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
10ea0 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
10eb0 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
10ec0 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20  O(pPager)))).   
10ed0 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
10ee0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
10ef0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
10f00 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64  er, nMaster, iHd
10f10 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20  rOff+4))).   || 
10f20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
10f30 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
10f40 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
10f50 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29  Master, nMaster)
10f60 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
10f70 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10f80 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10f90 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
10fa0 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c  4, cksum))).   |
10fb0 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
10fc0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
10fd0 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
10fe0 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20 20  alMagic, 8,.    
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48 64               iHd
11010 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38  rOff+4+nMaster+8
11020 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ))).  ){.    ret
11030 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
11040 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11050 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29   += (nMaster+20)
11060 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
11070 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
11080 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
11090 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
110a0 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
110b0 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
110c0 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
110d0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
110e0 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
110f0 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
11100 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
11110 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
11120 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
11130 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
11140 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
11150 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
11160 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
11170 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
11180 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
11190 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
111a0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
111b0 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
111c0 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
111d0 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
111e0 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
111f0 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
11200 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
11210 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
11220 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
11230 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
11240 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
11250 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
11260 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11270 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
11280 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
11290 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
112a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
112b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
112c0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
112d0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
112e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
112f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
11310 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
11320 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
11330 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
11340 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
11350 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
11360 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11370 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11380 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  sion++;.  sqlite
11390 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
113a0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
113b0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
113c0 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50  Clear(pPager->pP
113d0 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
113e0 20 52 65 74 75 72 6e 20 74 68 65 20 70 50 61 67   Return the pPag
113f0 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
11400 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71   value.*/.u32 sq
11410 6c 69 74 65 33 50 61 67 65 72 44 61 74 61 56 65  lite3PagerDataVe
11420 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  rsion(Pager *pPa
11430 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
11440 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
11450 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72  AGER_OPEN );.  r
11460 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44  eturn pPager->iD
11470 61 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f  ataVersion;.}../
11480 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74  *.** Free all st
11490 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
114a0 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
114b0 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74  [] array and set
114c0 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61   both.** Pager.a
114d0 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61  Savepoint and Pa
114e0 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74  ger.nSavepoint t
114f0 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68  o zero. Close th
11500 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
11510 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61   if it is open a
11520 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
11530 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11540 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   mode..*/.static
11550 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c   void releaseAll
11560 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72  Savepoints(Pager
11570 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
11580 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
11590 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
115a0 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
115b0 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  gh Pager.aSavepo
115c0 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  int */.  for(ii=
115d0 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
115e0 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
115f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
11600 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
11610 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
11620 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
11630 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
11640 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
11650 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d   || sqlite3IsMem
11660 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
11670 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
11680 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11690 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
116a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
116b0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
116c0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
116d0 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
116e0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
116f0 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
11700 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
11710 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
11720 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
11730 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
11740 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
11750 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
11760 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
11770 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
11780 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
11790 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
117a0 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
117b0 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
117c0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
117d0 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
117e0 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
117f0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
11800 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11820 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11830 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
11840 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
11850 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
11860 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
11870 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11880 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
11890 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
118a0 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
118b0 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
118c0 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
118d0 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
118e0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
118f0 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
11900 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
11910 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
11920 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
11930 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
11940 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
11950 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
11960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11970 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11980 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11990 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
119a0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
119b0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
119c0 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45   not.** in the E
119d0 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65  RROR state. Othe
119e0 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68  rwise, it switch
119f0 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
11a00 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74  PAGER_OPEN.** st
11a10 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
11a20 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
11a30 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
11a40 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74  ss mode, the dat
11a50 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a  abase file is.**
11a60 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f   completely unlo
11a70 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c  cked. If the fil
11a80 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e  e is unlocked an
11a90 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  d the file-syste
11aa0 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  m does.** not ex
11ab0 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45  hibit the UNDELE
11ac0 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20  TABLE_WHEN_OPEN 
11ad0 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f  property, the jo
11ae0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
11af0 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69   closed (if it i
11b00 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49  s open)..**.** I
11b10 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11b20 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
11b30 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
11b40 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
11b50 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
11b60 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
11b70 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65  are discarded be
11b80 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62  fore switching b
11b90 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f  ack to .** the O
11ba0 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72  PEN state. Regar
11bb0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
11bc0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
11bd0 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a   exclusive-mode.
11be0 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a  ** or not, any j
11bf0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74  ournal file left
11c00 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
11c10 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61  tem will be trea
11c20 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d  ted.** as a hot-
11c30 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
11c40 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74  ed back the next
11c50 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61   time a read-tra
11c60 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f  nsaction.** is o
11c70 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f  pened (by this o
11c80 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63  r by any other c
11c90 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73  onnection)..*/.s
11ca0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11cb0 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
11cc0 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72  Pager){..  asser
11cd0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
11ce0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
11cf0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
11d00 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11d10 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c  _OPEN .       ||
11d20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11d30 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20  =PAGER_ERROR .  
11d40 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  );..  sqlite3Bit
11d50 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
11d60 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
11d70 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
11d80 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65  rnal = 0;.  rele
11d90 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
11da0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
11db0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
11dc0 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
11dd0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
11de0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
11df0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
11e00 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
11e10 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
11e20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
11e30 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
11e40 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
11e50 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
11e60 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
11e90 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  de returned by p
11ea0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a  agerUnlockDb() *
11eb0 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  /.    int iDc = 
11ec0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
11ed0 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69  d)?sqlite3OsDevi
11ee0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
11ef0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b  s(pPager->fd):0;
11f00 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
11f10 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
11f20 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f   support deletio
11f30 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c  n of open files,
11f40 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f   then.    ** clo
11f50 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
11f60 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
11f70 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
11f80 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ock.  Otherwise.
11f90 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63      ** another c
11fa0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
11fb0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
11fc0 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20  te might delete 
11fd0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
11fe0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
11ff0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
12000 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12010 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
12020 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
12030 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12040 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
12050 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
12060 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12070 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
12080 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  AL      & 5)!=1 
12090 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
120a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
120b0 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21  E_DELETE   & 5)!
120c0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
120d0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
120e0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
120f0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
12100 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12110 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
12120 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
12130 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51  if( 0==(iDc & SQ
12140 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
12150 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
12160 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50  ).     || 1!=(pP
12170 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
12180 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20  e & 5).    ){.  
12190 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
121a0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
121b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
121c0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
121d0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
121e0 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74  e and the call t
121f0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
12200 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
12210 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65  e fails, set the
12220 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f   current lock to
12230 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53   UNKNOWN_LOCK. S
12240 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20  ee the comment. 
12250 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20     ** above the 
12260 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e  #define for UNKN
12270 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
12280 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77  explanation of w
12290 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  hy this.    ** i
122a0 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  s necessary..   
122b0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
122c0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
122d0 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  r, NO_LOCK);.   
122e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
122f0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OK && pPager->eS
12300 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
12310 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  R ){.      pPage
12320 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f  r->eLock = UNKNO
12330 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a  WN_LOCK;.    }..
12340 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
12350 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68   state may be ch
12360 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52  anged from PAGER
12370 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f  _ERROR to PAGER_
12380 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a  OPEN here.    **
12390 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e   without clearin
123a0 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  g the error code
123b0 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74  . This is intent
123c0 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f  ional - the erro
123d0 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73  r.    ** code is
123e0 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65   cleared and the
123f0 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20   cache reset in 
12400 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e  the block below.
12410 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
12420 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
12430 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
12440 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
12450 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OR );.    pPager
12460 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
12470 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
12480 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12490 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f  R_OPEN;.  }..  /
124a0 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
124b0 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
124c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
124d0 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
124e0 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65  t be.  ** truste
124f0 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72  d. Now that ther
12500 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
12510 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
12520 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20  to the pager,.  
12530 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79  ** it can safely
12540 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41   move back to PA
12550 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20  GER_OPEN state. 
12560 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  This happens in 
12570 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  both.  ** normal
12580 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c   and exclusive-l
12590 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a  ocking mode..  *
125a0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
125b0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61  errCode ){.    a
125c0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
125d0 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
125e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
125f0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
12600 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
12610 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50  tempFile;.    pP
12620 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12630 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70  AGER_OPEN;.    p
12640 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
12660 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
12670 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
12680 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
12690 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
126a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
126b0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
126c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
126d0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
126e0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
126f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12700 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
12710 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
12720 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
12730 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
12740 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
12750 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
12760 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
12770 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
12780 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
12790 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
127a0 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
127b0 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
127c0 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
127d0 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
127e0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
127f0 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
12800 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
12810 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
12820 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
12830 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
12840 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
12850 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
12860 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
12870 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
12880 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
12890 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
128a0 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
128b0 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
128c0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
128d0 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
128e0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
128f0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
12900 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
12910 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
12920 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
12930 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
12940 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
12950 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
12960 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
12970 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
12980 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
12990 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
129a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
129b0 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
129c0 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
129d0 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
129e0 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
129f0 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
12a00 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
12a10 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12a20 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
12a30 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
12a40 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
12a50 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
12a60 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
12a70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
12a80 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
12a90 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
12aa0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
12ab0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12ac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12ad0 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
12ae0 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
12af0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12b00 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
12b10 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
12b20 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
12b30 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
12b40 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
12b50 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
12b60 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
12b70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12b80 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12b90 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12ba0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12bb0 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
12bc0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
12bd0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
12be0 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
12bf0 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
12c00 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
12c10 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
12c20 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
12c30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
12c40 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
12c50 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
12c60 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
12c70 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
12c80 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
12c90 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f   Pgno nPage);../
12ca0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12cb0 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
12cc0 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74  tion. A transact
12cd0 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65  ion is usually e
12ce0 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68  nded by .** eith
12cf0 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  er a COMMIT or a
12d00 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
12d10 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ion. This routin
12d20 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  e may be called 
12d30 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  .** after rollba
12d40 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ck of a hot-jour
12d50 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  nal, or if an er
12d60 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
12d70 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20   opening.** the 
12d80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
12d90 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79  writing the very
12da0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
12db0 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61  eader of a.** da
12dc0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
12dd0 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  on..** .** This 
12de0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
12df0 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52   called in PAGER
12e00 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66  _ERROR state. If
12e10 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a   it is called.**
12e20 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f   in PAGER_NONE o
12e30 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  r PAGER_SHARED s
12e40 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  tate and the loc
12e50 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a  k held is less.*
12e60 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e  * exclusive than
12e70 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
12e80 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
12e90 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
12ea0 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76  , any active sav
12eb0 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65  epoints are rele
12ec0 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ased..**.** If t
12ed0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12ee0 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  is open, then it
12ef0 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e   is "finalized".
12f00 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20   Once a journal 
12f10 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65  .** file has bee
12f20 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69  n finalized it i
12f30 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
12f40 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c  o use it to roll
12f50 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e   back a .** tran
12f60 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c  saction. Nor wil
12f70 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72  l it be consider
12f80 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a  ed to be a hot-j
12f90 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a  ournal by this.*
12fa0 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64  * or any other d
12fb0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12fc0 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  on. Exactly how 
12fd0 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  a journal is fin
12fe0 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64  alized.** depend
12ff0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
13000 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73  not the pager is
13010 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
13020 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a  usive mode and.*
13030 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  * the current jo
13040 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65  urnal-mode (Page
13050 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61  r.journalMode va
13060 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  lue), as follows
13070 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  :.**.**   journa
13080 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a  lMode==MEMORY.**
13090 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
130a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
130b0 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54  simply closed. T
130c0 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20  his destroys an 
130d0 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  .**     in-memor
130e0 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  y journal..**.**
130f0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13100 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20  TRUNCATE.**     
13110 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  Journal file is 
13120 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
13130 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
13140 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13150 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a  Mode==PERSIST.**
13160 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32       The first 2
13170 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
13180 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20  ournal file are 
13190 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76  zeroed. This inv
131a0 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20  alidates.**     
131b0 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
131c0 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
131d0 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20  file, and hence 
131e0 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
131f0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  al.**     file. 
13200 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e  An invalid journ
13210 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  al file cannot b
13220 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
13230 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13240 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20  de==DELETE.**   
13250 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
13260 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  le is closed and
13270 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73   deleted using s
13280 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
13290 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74  ..**.**     If t
132a0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
132b0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
132c0 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68   mode, this meth
132d0 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67  od of finalizing
132e0 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
132f0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
13300 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c  r used. Instead,
13310 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d   if the journalM
13320 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45  ode is.**     DE
13330 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67  LETE and the pag
13340 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
13350 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74  ve mode, the met
13360 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e  hod described un
13370 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  der.**     journ
13380 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20  alMode==PERSIST 
13390 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
133a0 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
133b0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
133c0 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72  lized, the pager
133d0 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
133e0 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a  READER state..**
133f0 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   If running in n
13400 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c  on-exclusive rol
13410 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20  lback mode, the 
13420 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
13430 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64   is .** downgrad
13440 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c  ed to a SHARED_L
13450 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
13460 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
13470 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
13480 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
13490 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
134a0 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
134b0 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
134c0 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
134d0 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
134e0 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
134f0 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
13500 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
13510 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
13520 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
13530 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
13540 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
13550 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
13560 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
13570 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
13580 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
13590 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
135a0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
135b0 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
135c0 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
135d0 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
135e0 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
135f0 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
13600 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
13610 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
13620 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
13630 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
13640 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
13650 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
13660 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
13670 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
13680 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74  t hasMaster, int
13690 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74   bCommit){.  int
136a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
136b0 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
136c0 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
136d0 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
136e0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
136f0 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
13700 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
13710 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
13720 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
13730 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  n */..  /* Do no
13740 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67  thing if the pag
13750 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
13760 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
13770 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
13780 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  or at least a RE
13790 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69  SERVED lock. Thi
137a0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
137b0 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
137c0 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
137d0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
137e0 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45   active but a RE
137f0 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
13800 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68  r lock is.  ** h
13810 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69  eld under two ci
13820 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a  rcumstances:.  *
13830 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65  *.  **   1. Afte
13840 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68  r a successful h
13850 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
13860 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65  ack, it is calle
13870 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20  d with.  **     
13880 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e   eState==PAGER_N
13890 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45  ONE and eLock==E
138a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20  XCLUSIVE_LOCK.. 
138b0 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66   **.  **   2. If
138c0 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69   a connection wi
138d0 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
138e0 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e  exclusive holdin
138f0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  g an EXCLUSIVE .
13900 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73    **      lock s
13910 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20  witches back to 
13920 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
13930 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65  mal and then exe
13940 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20  cutes a.  **    
13950 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69    read-transacti
13960 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  on, this functio
13970 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
13980 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52   eState==PAGER_R
13990 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20  EADER .  **     
139a0 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
139b0 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20  USIVE_LOCK when 
139c0 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
139d0 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a  tion is closed..
139e0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
139f0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
13a00 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
13a10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
13a20 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
13a30 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  OR );.  if( pPag
13a40 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
13a50 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26  _WRITER_LOCKED &
13a60 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  & pPager->eLock<
13a70 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
13a80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13a90 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  TE_OK;.  }..  re
13aa0 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
13ab0 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  ts(pPager);.  as
13ac0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
13ad0 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
13ae0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
13af0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
13b00 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13b10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
13b20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
13b30 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  er) );..    /* F
13b40 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
13b50 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
13b60 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65   if( sqlite3IsMe
13b70 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
13b80 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  >jfd) ){.      a
13b90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
13ba0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13bb0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
13bc0 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71  MORY );.      sq
13bd0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
13be0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
13bf0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
13c00 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13c10 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13c20 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
13c30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
13c40 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
13c50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
13c60 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
13c70 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
13c80 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
13c90 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
13ca0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
13cb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13cc0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
13cd0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
13ce0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
13cf0 6e 65 77 20 66 69 6c 65 20 73 69 7a 65 20 69 73  new file size is
13d00 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
13d10 65 20 69 6e 6f 64 65 20 72 69 67 68 74 20 61 77  e inode right aw
13d20 61 79 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ay..          **
13d30 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 6a   Otherwise the j
13d40 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 72 65 73  ournal might res
13d50 75 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67  urrect following
13d60 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e   a power loss an
13d70 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  d.          ** c
13d80 61 75 73 65 20 74 68 65 20 6c 61 73 74 20 74 72  ause the last tr
13d90 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c  ansaction to rol
13da0 6c 20 62 61 63 6b 2e 20 20 53 65 65 0a 20 20 20  l back.  See.   
13db0 20 20 20 20 20 20 20 2a 2a 20 68 74 74 70 73 3a         ** https:
13dc0 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c  //bugzilla.mozil
13dd0 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e  la.org/show_bug.
13de0 63 67 69 3f 69 64 3d 31 30 37 32 37 37 33 0a 20  cgi?id=1072773. 
13df0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
13e00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13e10 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
13e20 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
13e30 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ncFlags);.      
13e40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13e50 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13e60 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
13e70 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
13e80 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13e90 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
13ea0 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20  ERSIST.      || 
13eb0 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
13ec0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
13ed0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
13ee0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13ef0 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20  _WAL).    ){.   
13f00 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
13f10 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
13f20 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
13f30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13f40 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
13f50 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  se{.      /* Thi
13f60 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20  s branch may be 
13f70 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61  executed with Pa
13f80 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  ger.journalMode=
13f90 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20  =MEMORY if.     
13fa0 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
13fb0 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65  l was just rolle
13fc0 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  d back. In this 
13fd0 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
13fe0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73  .      ** file s
13ff0 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
14000 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20  and deleted. If 
14010 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
14020 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20  writes to.      
14030 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14040 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f  file, it will do
14050 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d   so using an in-
14060 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
14070 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14080 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 28 21  int bDelete = (!
14090 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
140a0 20 26 26 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e   && sqlite3Journ
140b0 61 6c 45 78 69 73 74 73 28 70 50 61 67 65 72 2d  alExists(pPager-
140c0 3e 6a 66 64 29 29 3b 0a 20 20 20 20 20 20 61 73  >jfd));.      as
140d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
140e0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
140f0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
14100 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
14110 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
14120 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14130 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
14140 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
14150 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14160 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14170 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
14180 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
14190 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
141a0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
141b0 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ( bDelete ){.   
141c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
141d0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
141e0 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
141f0 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
14200 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14210 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
14220 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c  HECK_PAGES.  sql
14230 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
14240 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
14250 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
14260 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69  t_pagehash);.  i
14270 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
14280 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50  e==0 && sqlite3P
14290 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
142a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
142b0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
142c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
142d0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
142e0 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
142f0 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
14300 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
14310 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
14320 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20  Null(p);.    }. 
14330 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
14340 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
14350 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
14360 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
14370 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
14380 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
14390 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  = 0;.  sqlite3Pc
143a0 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
143b0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
143c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
143d0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
143e0 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
143f0 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20  dbSize);..  if( 
14400 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
14410 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72  er) ){.    /* Dr
14420 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74 65  op the WAL write
14430 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41  -lock, if any. A
14440 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e  lso, if the conn
14450 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20  ection was in . 
14460 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f     ** locking_mo
14470 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
14480 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e but is no long
14490 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43  er, drop the EXC
144a0 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c  LUSIVE .    ** l
144b0 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
144c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
144d0 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20     */.    rc2 = 
144e0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69  sqlite3WalEndWri
144f0 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  teTransaction(pP
14500 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
14510 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51   assert( rc2==SQ
14520 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c  LITE_OK );.  }el
14530 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
14540 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
14550 26 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  && pPager->dbFil
14560 65 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62  eSize>pPager->db
14570 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Size ){.    /* T
14580 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
14590 6b 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ken when committ
145a0 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
145b0 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  n in rollback-jo
145c0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64  urnal.    ** mod
145d0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
145e0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
145f0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
14600 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
14610 2e 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  ..    ** At this
14620 20 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e   point the journ
14630 61 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  al has been fina
14640 6c 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72  lized and the tr
14650 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
14660 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  * successfully c
14670 6f 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68  ommitted, but th
14680 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
14690 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
146a0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c  n the.    ** fil
146b0 65 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66 65  e. So it is safe
146c0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
146d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
146e0 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20  o its minimum.  
146f0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69    ** required si
14700 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ze.  */.    asse
14710 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
14720 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
14730 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
14740 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
14750 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ger, pPager->dbS
14760 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ize);.  }..  if(
14770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14780 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f  & bCommit && isO
14790 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
147a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
147b0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
147c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
147d0 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54  ITE_FCNTL_COMMIT
147e0 5f 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20  _PHASETWO, 0);. 
147f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14800 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20  E_NOTFOUND ) rc 
14810 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
14820 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
14830 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
14840 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65     && (!pagerUse
14850 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73  Wal(pPager) || s
14860 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
14870 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
14880 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20  Wal, 0)).  ){.  
14890 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c    rc2 = pagerUnl
148a0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
148b0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
148c0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
148d0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
148e0 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
148f0 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
14900 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
14910 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65  aster = 0;..  re
14920 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
14930 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a  _OK?rc2:rc);.}..
14940 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
14950 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
14960 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
14970 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
14980 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
14990 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
149a0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
149b0 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
149c0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64  e ERROR state, d
149d0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
149e0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
149f0 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
14a00 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
14a10 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
14a20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
14a30 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
14a40 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
14a50 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
14a60 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
14a70 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
14a80 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62  move the pager b
14a90 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
14aa0 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d  e. If this .** m
14ab0 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
14ac0 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
14ad0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
14ae0 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
14af0 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  xt .** connectio
14b00 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  n to obtain a sh
14b10 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
14b20 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
14b30 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a  y be this one) .
14b40 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20  ** will roll it 
14b50 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
14b60 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
14b70 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
14b80 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
14b90 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
14ba0 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
14bb0 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
14bc0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
14bd0 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
14be0 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
14bf0 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
14c00 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69  ERROR state. Whi
14c10 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
14c20 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
14c30 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14c40 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
14c50 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
14c60 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
14c70 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
14c80 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
14c90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
14ca0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
14cb0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
14cc0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
14cd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  {.    assert( as
14ce0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
14cf0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
14d00 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
14d10 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
14d20 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
14d30 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
14d40 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
14d50 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
14d60 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
14d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
14d80 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
14d90 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
14da0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
14db0 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61  eMode ){.      a
14dc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
14dd0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
14de0 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67  DER );.      pag
14df0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
14e00 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29  on(pPager, 0, 0)
14e10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61  ;.    }.  }.  pa
14e20 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
14e30 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  r);.}../*.** Par
14e40 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
14e50 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
14e60 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
14e70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
14e80 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
14e90 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
14ea0 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
14eb0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
14ec0 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
14ed0 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
14ee0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
14ef0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14f00 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
14f10 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
14f20 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
14f30 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
14f40 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
14f50 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
14f60 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
14f70 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
14f80 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
14f90 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
14fa0 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
14fb0 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
14fc0 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
14fd0 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
14fe0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
14ff0 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
15000 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
15010 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
15020 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
15030 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
15040 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
15050 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
15060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
15070 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
15080 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
15090 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
150a0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
150b0 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
150c0 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
150d0 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
150e0 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
150f0 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
15100 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
15110 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
15120 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
15130 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
15140 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
15150 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
15160 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
15170 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
15180 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
15190 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
151a0 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
151b0 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
151c0 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
151d0 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
151e0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
151f0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
15200 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
15210 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
15220 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
15230 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
15240 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
15250 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
15260 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
15270 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15280 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
15290 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
152a0 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
152b0 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
152c0 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
152d0 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
152e0 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
152f0 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63  .** Report the c
15300 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65  urrent page size
15310 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
15320 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61  eserved bytes ba
15330 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64  ck.** to the cod
15340 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ec..*/.#ifdef SQ
15350 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73  LITE_HAS_CODEC.s
15360 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
15370 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72  ReportSize(Pager
15380 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
15390 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
153a0 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70  izeChng ){.    p
153b0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
153c0 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43  eChng(pPager->pC
153d0 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61  odec, pPager->pa
153e0 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e     (int)pPager->
15410 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d  nReserve);.  }.}
15420 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
15430 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
15440 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20  X)     /* No-op 
15450 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  if we do not sup
15460 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a  port a codec */.
15470 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
15480 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
15490 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
154a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
154b0 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29  f isMainJrnl==1)
154c0 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   or.** from the 
154d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20  sub-journal (if 
154e0 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61  isMainJrnl==0) a
154f0 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74  nd playback that
15500 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61   page..** The pa
15510 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66  ge begins at off
15520 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74  set *pOffset int
15530 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20  o the file. The 
15540 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75  *pOffset.** valu
15550 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74  e is increased t
15560 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
15570 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
15580 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
15590 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  ** The main roll
155a0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
155b0 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68  s checksums - th
155c0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
155d0 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74  nal does .** not
155e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
155f0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
15600 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65  e page record re
15610 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
15620 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
15630 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
15640 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
15650 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
15660 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ize, then playba
15670 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64  ck is.** skipped
15680 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
15690 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
156a0 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f  * If pDone is no
156b0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
156c0 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70  is a record of p
156d0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61  ages that have a
156e0 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
156f0 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20  layed back.  If 
15700 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66  the page at *pOf
15710 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79  fset has already
15720 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
15730 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72  k.** (if the cor
15740 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65  responding pDone
15750 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65   bit is set) the
15760 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62  n skip the playb
15770 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ack..** Make sur
15780 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20  e the pDone bit 
15790 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
157a0 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61   the *pOffset pa
157b0 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69  ge is set.** pri
157c0 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e  or to returning.
157d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
157e0 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63  ge record is suc
157f0 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
15800 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
15810 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e  urnal file.** an
15820 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74  d played back, t
15830 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
15840 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
15850 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
15860 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e  .** while readin
15870 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f  g the record fro
15880 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
15890 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c  nal file or whil
158a0 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20  e writing.** to 
158b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
158c0 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  e, then the IO e
158d0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
158e0 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a  urned. If data.*
158f0 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  * is successfull
15900 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
15910 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
15920 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74  le but appears t
15930 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  o be.** corrupte
15940 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
15950 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61  s returned. Data
15960 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63   is considered c
15970 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74  orrupted in.** t
15980 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
15990 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20  :.** .**   * If 
159a0 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d  the record page-
159b0 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61  number is illega
159c0 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a  l (0 or PAGER_MJ
159d0 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20  _PGNO), or.**   
159e0 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
159f0 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
15a00 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
15a10 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  in journal file.
15a20 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63  **     and the c
15a30 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f  hecksum field do
15a40 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
15a50 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e   record content.
15a60 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f  .**.** Neither o
15a70 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e  f these two scen
15a80 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62  arios are possib
15a90 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65  le during a save
15aa0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
15ab0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
15ac0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15ad0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f  lback, then memo
15ae0 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62  ry may have to b
15af0 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  e dynamically.**
15b00 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
15b10 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  is function. If 
15b20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
15b30 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69   and an allocati
15b40 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c  on fails,.** SQL
15b50 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
15b60 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
15b70 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
15b80 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
15b90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15bb0 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67   The pager being
15bc0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
15bd0 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bf0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
15c00 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
15c10 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
15c20 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ne,             
15c30 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20     /* Bitvec of 
15c40 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c  pages already pl
15c50 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
15c60 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c80 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
15c90 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
15ca0 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  nal. */.  int is
15cb0 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20  Savepnt         
15cc0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15cd0 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20  for a savepoint 
15ce0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  rollback */.){. 
15cf0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
15d00 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
15d10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
15d20 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
15d30 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
15d40 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d60 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
15d70 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
15d80 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
15d90 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
15da0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
15db0 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
15dc0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
15dd0 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20    char *aData;  
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
15e00 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
15e10 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
15e20 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
15e30 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
15e40 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
15e50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15e60 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63   */.  int isSync
15e70 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
15e80 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
15e90 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73  ournal page is s
15ea0 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  ynced */..  asse
15eb0 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
15ec0 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
15ed0 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
15ee0 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
15ef0 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
15f00 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
15f10 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
15f20 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15f30 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
15f40 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
15f50 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
15f60 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
15f70 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
15f80 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
15f90 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
15fa0 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
15fb0 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
15fc0 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
15fd0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
15fe0 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
15ff0 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
16000 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
16010 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
16020 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
16030 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
16040 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
16050 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c   || (!isMainJrnl
16060 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29   && isSavepnt) )
16070 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74  ;..  /* Either t
16080 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61  he state is grea
16090 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57  ter than PAGER_W
160a0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28  RITER_CACHEMOD (
160b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  a transaction . 
160c0 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
160d0 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61   rollback done a
160e0 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66  t the request of
160f0 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20   the caller) or 
16100 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68  this is.  ** a h
16110 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
16120 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20  ack. If it is a 
16130 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
16140 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a  back, the pager.
16150 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65    ** is in state
16160 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20   OPEN and holds 
16170 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
16180 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  k. Hot-journal r
16190 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c  ollback.  ** onl
161a0 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65  y reads from the
161b0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e   main journal, n
161c0 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ot the sub-journ
161d0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
161e0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
161f0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
16200 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
16210 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  || (pPager->eSta
16220 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
16230 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  & pPager->eLock=
16240 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
16250 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
16260 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
16270 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
16280 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a  HEMOD || isMainJ
16290 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  rnl );..  /* Rea
162a0 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
162b0 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
162c0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
162d0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
162e0 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
162f0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
16300 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
16310 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
16320 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
16330 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
16340 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
16350 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
16360 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
16370 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
16380 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
16390 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
163a0 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
163b0 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28  te3OsRead(jfd, (
163c0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
163d0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
163e0 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
163f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16400 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
16410 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
16420 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
16430 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
16440 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
16450 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
16460 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
16470 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
16480 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
16490 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
164a0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
164b0 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
164c0 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
164d0 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
164e0 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
164f0 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
16500 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
16510 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
16520 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
16530 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
16540 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
16550 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
16560 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
16570 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
16580 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
16590 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
165a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
165b0 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
165c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
165d0 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
165e0 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
165f0 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
16600 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
16610 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
16620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16630 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
16640 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
16650 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
16660 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
16670 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
16680 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
16690 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
166a0 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
166b0 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
166c0 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29  )aData)!=cksum )
166d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
166e0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
166f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
16700 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72  his page has alr
16710 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
16720 20 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e   by before durin
16730 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  g the current.  
16740 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  ** rollback, the
16750 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74  n don't bother t
16760 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61  o play it back a
16770 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
16780 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
16790 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
167a0 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
167b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
167c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
167d0 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69  .  /* When playi
167e0 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20  ng back page 1, 
167f0 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73  restore the nRes
16800 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a  erve setting.  *
16810 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  /.  if( pgno==1 
16820 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  && pPager->nRese
16830 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61  rve!=((u8*)aData
16840 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61  )[20] ){.    pPa
16850 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
16860 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
16870 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
16880 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
16890 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
168a0 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48  pager is in CACH
168b0 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e  EMOD state, then
168c0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
168d0 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
168e0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
168f0 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
16900 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
16910 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
16920 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
16930 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16940 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
16950 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
16960 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
16970 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
16980 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
16990 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
169a0 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
169b0 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
169c0 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
169d0 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
169e0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
169f0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
16a00 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
16a10 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
16a20 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
16a30 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
16a40 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
16a50 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
16a60 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
16a70 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
16a80 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
16a90 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
16aa0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
16ab0 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
16ac0 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
16ad0 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
16ae0 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
16af0 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f  ** If in WRITER_
16b00 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49  DBMOD, WRITER_FI
16b10 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73  NISHED or OPEN s
16b20 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
16b30 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61  date the.  ** pa
16b40 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
16b50 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d  exists and the m
16b60 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
16b70 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
16b80 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74  d .  ** not dirt
16b90 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f  y. Since this co
16ba0 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75  de is only execu
16bb0 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  ted in PAGER_OPE
16bc0 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a  N state for.  **
16bd0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
16be0 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67  ollback, it is g
16bf0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
16c00 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73  he page-cache is
16c10 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74   empty.  ** if t
16c20 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f  he pager is in O
16c30 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a  PEN state..  **.
16c40 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
16c50 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
16c60 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
16c70 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
16c80 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
16c90 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
16ca0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
16cb0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
16cc0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
16cd0 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
16ce0 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
16cf0 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
16d00 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
16d10 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
16d20 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
16d30 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
16d40 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
16d50 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
16d60 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
16d70 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
16d80 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
16d90 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
16da0 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
16db0 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
16dc0 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
16dd0 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
16de0 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
16df0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
16e00 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
16e10 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
16e20 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
16e30 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
16e40 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
16e50 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
16e60 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
16e70 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16e80 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
16e90 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
16ea0 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
16eb0 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
16ec0 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
16ed0 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
16ee0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
16ef0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
16f00 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
16f10 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
16f20 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
16f30 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
16f40 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
16f50 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
16f60 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
16f70 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
16f80 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
16f90 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
16fa0 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
16fb0 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
16fc0 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
16fd0 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
16fe0 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
16ff0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
17000 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
17010 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
17020 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
17030 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
17040 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
17050 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
17060 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
17070 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
17080 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
17090 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
170a0 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
170b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67  ..  */.  if( pag
170c0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
170d0 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
170e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
170f0 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
17100 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  Lookup(pPager, p
17110 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  gno);.  }.  asse
17120 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44  rt( pPg || !MEMD
17130 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
17140 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
17150 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67  AGER_OPEN || pPg
17160 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  ==0 );.  PAGERTR
17170 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE(("PLAYBACK %
17180 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
17190 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20  08x) %s\n",.    
171a0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
171b0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
171c0 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
171d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
171e0 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20  u8*)aData),.    
171f0 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72         (isMainJr
17200 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c  nl?"main-journal
17210 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29  ":"sub-journal")
17220 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d  .  ));.  if( isM
17230 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69  ainJrnl ){.    i
17240 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  sSynced = pPager
17250 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f  ->noSync || (*pO
17260 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d  ffset <= pPager-
17270 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
17280 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e  }else{.    isSyn
17290 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c  ced = (pPg==0 ||
172a0 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20   0==(pPg->flags 
172b0 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
172c0 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  C));.  }.  if( i
172d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
172e0 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
172f0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
17300 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
17310 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
17320 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26  AGER_OPEN).   &&
17330 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20   isSynced.  ){. 
17340 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70     i64 ofst = (p
17350 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
17360 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
17370 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53    testcase( !isS
17380 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30  avepnt && pPg!=0
17390 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
173a0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
173b0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
173c0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
173d0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
173e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
173f0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
17400 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67  u8 *)aData, pPag
17410 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
17420 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
17430 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
17440 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
17450 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
17460 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
17470 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
17480 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Backup ){.      
17490 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
174a0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
174b0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
174c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
174d0 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
174e0 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
174f0 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20  , (u8*)aData);. 
17500 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
17510 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
17520 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   7, rc=SQLITE_NO
17530 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  MEM, aData);.   
17540 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
17550 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
17560 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
17570 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
17580 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
17590 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
175a0 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
175b0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
175c0 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
175d0 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
175e0 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
175f0 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
17600 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
17610 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
17620 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
17630 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
17640 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
17650 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
17660 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
17670 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
17680 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
17690 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
176a0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
176b0 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
176c0 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
176d0 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
176e0 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
176f0 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
17700 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
17710 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
17720 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
17730 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
17740 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
17750 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
17760 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
17770 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
17780 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
17790 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
177a0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
177b0 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
177c0 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
177d0 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
177e0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
177f0 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
17800 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
17810 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
17820 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
17830 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
17840 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
17850 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
17860 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
17870 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
17880 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
17890 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
178a0 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
178b0 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
178c0 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
178d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
178e0 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
178f0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
17900 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
17910 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
17920 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )==0 );.    pPag
17930 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
17940 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  = SPILLFLAG_ROLL
17950 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73  BACK;.    rc = s
17960 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
17970 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  re(pPager, pgno,
17980 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61   &pPg, 1);.    a
17990 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
179a0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
179b0 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29  LLFLAG_ROLLBACK)
179c0 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
179d0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d  r->doNotSpill &=
179e0 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   ~SPILLFLAG_ROLL
179f0 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63  BACK;.    if( rc
17a00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
17a10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 67  turn rc;.    pPg
17a20 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
17a30 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20  R_NEED_READ;.   
17a40 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
17a50 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
17a60 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
17a70 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
17a80 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
17a90 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
17aa0 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
17ab0 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
17ac0 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
17ad0 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
17ae0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
17af0 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
17b00 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
17b10 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
17b20 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
17b30 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
17b40 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
17b50 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
17b60 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
17b70 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
17b80 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
17b90 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  ** sqlite3PagerR
17ba0 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a  ollback()..    *
17bb0 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
17bc0 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70  a;.    pData = p
17bd0 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d  Pg->pData;.    m
17be0 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38  emcpy(pData, (u8
17bf0 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
17c00 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
17c10 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
17c20 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  r(pPg);.    if( 
17c30 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21  isMainJrnl && (!
17c40 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f  isSavepnt || *pO
17c50 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a  ffset<=pPager->j
17c60 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20  ournalHdr) ){.  
17c70 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
17c80 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
17c90 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65  age were just re
17ca0 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20  stored from the 
17cb0 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a  main .      ** j
17cc0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
17cd0 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75  n its content mu
17ce0 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65  st be as they we
17cf0 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20  re when the .   
17d00 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
17d10 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e  n was first open
17d20 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
17d30 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65   we can mark the
17d40 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61   page.      ** a
17d50 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74  s clean, since t
17d60 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20  here will be no 
17d70 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74  need to write it
17d80 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20   out to the.    
17d90 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
17da0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
17db0 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78   There is one ex
17dc0 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  ception to this 
17dd0 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  rule. If the pag
17de0 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  e is being rolle
17df0 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
17e00 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76  as part of a sav
17e10 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65  epoint (or state
17e20 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66  ment) rollback f
17e30 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a  rom an .      **
17e40 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
17e50 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  n of the main jo
17e60 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
17e70 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a   it is not safe.
17e80 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b        ** to mark
17e90 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
17ea0 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  an. This is beca
17eb0 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20  use marking the 
17ec0 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a  page as.      **
17ed0 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61   clean will clea
17ee0 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
17ef0 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63  _SYNC flag. Sinc
17f00 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20  e the page is.  
17f10 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69      ** already i
17f20 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
17f30 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20  le (recorded in 
17f40 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
17f50 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74  ) and.      ** t
17f60 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
17f70 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  NC flag is clear
17f80 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  ed, if the page 
17f90 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  is written to.  
17fa0 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
17fb0 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
17fc0 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
17fd0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
17fe0 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   but.      ** th
17ff0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
18000 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20  C flag will not 
18010 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64  be set. It could
18020 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c   then potentiall
18030 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72  y.      ** be wr
18040 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74  itten out into t
18050 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18060 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72   before its jour
18070 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  nal file.      *
18080 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e  * segment is syn
18090 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20  ced. If a crash 
180a0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72  occurs during or
180b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c   following this,
180c0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
180d0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  se corruption ma
180e0 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a  y ensue..      *
180f0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
18100 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
18110 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71  ger) );.      sq
18120 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
18130 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
18140 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
18150 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20  agehash(pPg);.. 
18160 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
18170 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72  s page 1, then r
18180 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65  estore the value
18190 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
181a0 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20  Vers..    ** Do 
181b0 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20  this before any 
181c0 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20  decoding. */.   
181d0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
181e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
181f0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
18200 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b  , &((u8*)pData)[
18210 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65  24],sizeof(pPage
18220 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
18230 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
18240 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a  ecode the page j
18250 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ust read from di
18260 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31  sk */.    CODEC1
18270 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
18280 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63  pPg->pgno, 3, rc
18290 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
182a0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
182b0 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
182c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
182d0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
182e0 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68  er zMaster is th
182f0 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
18300 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
18310 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61   A single journa
18320 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72  l.** file that r
18330 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d  eferred to the m
18340 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18350 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  le has just been
18360 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
18370 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
18380 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f  ecks if it is po
18390 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
183a0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
183b0 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64  nal file,.** and
183c0 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69   does so if it i
183d0 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  s..**.** Argumen
183e0 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f  t zMaster may po
183f0 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d  int to Pager.pTm
18400 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20  pSpace. So that 
18410 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a  buffer is not .*
18420 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  * available for 
18430 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  use within this 
18440 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
18450 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f  When a master jo
18460 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72  urnal file is cr
18470 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70  eated, it is pop
18480 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ulated with the 
18490 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c  names .** of all
184a0 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f   of its child jo
184b0 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65  urnals, one afte
184c0 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61  r another, forma
184d0 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a  tted as utf-8 .*
184e0 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20  * encoded text. 
184f0 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20  The end of each 
18500 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69  child journal fi
18510 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  le is marked wit
18520 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  h a .** nul-term
18530 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30  inator byte (0x0
18540 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74  0). i.e. the ent
18550 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
18560 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
18570 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74  .** file for a t
18580 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c  ransaction invol
18590 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73  ving two databas
185a0 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a  es might be:.**.
185b0 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c  **   "/home/bill
185c0 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /a.db-journal\x0
185d0 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62  0/home/bill/b.db
185e0 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a  -journal\x00".**
185f0 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75  .** A master jou
18600 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e  rnal file may on
18610 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e  ly be deleted on
18620 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  ce all of its ch
18630 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73  ild .** journals
18640 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65   have been rolle
18650 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
18660 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64  is function read
18670 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  s the contents o
18680 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
18690 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a  rnal file into .
186a0 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f  ** memory and lo
186b0 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68  ops through each
186c0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   of the child jo
186d0 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72  urnal names. For
186e0 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a  .** each child j
186f0 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b  ournal, it check
18700 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  s if:.**.**   * 
18710 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  if the child jou
18720 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64  rnal exists, and
18730 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66   if so.**   * if
18740 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
18750 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65  al contains a re
18760 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65  ference to maste
18770 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20  r journal .**   
18780 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a    file zMaster.*
18790 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20  *.** If a child 
187a0 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66  journal can be f
187b0 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65  ound that matche
187c0 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72  s both of the cr
187d0 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c  iteria.** above,
187e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
187f0 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64  eturns without d
18800 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f  oing anything. O
18810 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20  therwise, if.** 
18820 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f  no such child jo
18830 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
18840 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72  nd, file zMaster
18850 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   is deleted from
18860 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73  .** the file-sys
18870 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65  tem using sqlite
18880 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
18890 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
188a0 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  r within this fu
188b0 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72  nction, an error
188c0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
188d0 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  d. This.** funct
188e0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65  ion allocates me
188f0 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20  mory by calling 
18900 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e  sqlite3Malloc().
18910 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   If an allocatio
18920 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49  n.** fails, SQLI
18930 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
18940 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
18950 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c   if no IO or mal
18960 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f  loc errors .** o
18970 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ccur, SQLITE_OK 
18980 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
18990 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75  ** TODO: This fu
189a0 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
189b0 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20   a single block 
189c0 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61  of memory to loa
189d0 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  d.** the entire 
189e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
189f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18a00 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20  ile. This could 
18a10 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f  be.** a couple o
18a20 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73  f kilobytes or s
18a30 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  o - potentially 
18a40 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
18a50 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a  page .** size..*
18a60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
18a70 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67  er_delmaster(Pag
18a80 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
18a90 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
18aa0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
18ab0 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
18ac0 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20  pVfs;.  int rc; 
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ae0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
18af0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
18b00 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20  le *pMaster;    
18b10 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74  /* Malloc'd mast
18b20 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
18b30 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
18b40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
18b50 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c  ournal;   /* Mal
18b60 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72  loc'd child-jour
18b70 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
18b80 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tor */.  char *z
18b90 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
18ba0 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f  0; /* Contents o
18bb0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
18bc0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e   file */.  i64 n
18bd0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20  MasterJournal;  
18be0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
18bf0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18c00 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
18c10 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
18c20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
18c30 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74   one journal wit
18c40 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20  hin MJ file */. 
18c50 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74   char *zMasterPt
18c60 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  r;         /* Sp
18c70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66  ace to hold MJ f
18c80 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a  ilename from a j
18c90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
18ca0 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b   int nMasterPtr;
18cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d             /* Am
18cc0 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c  ount of space al
18cd0 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74  located to zMast
18ce0 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a  erPtr[] */..  /*
18cf0 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
18d00 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f  for both the pJo
18d10 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65  urnal and pMaste
18d20 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
18d30 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63  rs..  ** If succ
18d40 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65  essful, open the
18d50 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18d60 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67  file for reading
18d70 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72  ..  */.  pMaster
18d80 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
18d90 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
18da0 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46  Zero(pVfs->szOsF
18db0 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75  ile * 2);.  pJou
18dc0 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f  rnal = (sqlite3_
18dd0 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70  file *)(((u8 *)p
18de0 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e  Master) + pVfs->
18df0 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28  szOsFile);.  if(
18e00 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !pMaster ){.   
18e10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
18e20 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
18e30 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
18e40 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
18e50 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
18e60 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
18e70 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  NAL);.    rc = s
18e80 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
18e90 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73  s, zMaster, pMas
18ea0 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  ter, flags, 0);.
18eb0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
18ec0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18ed0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
18ee0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
18ef0 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
18f00 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
18f10 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
18f20 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  .  ** sqlite3_ma
18f30 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
18f40 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
18f50 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20  Journal.   Also 
18f60 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66  obtain.  ** suff
18f70 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e  icient space (in
18f80 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20   zMasterPtr) to 
18f90 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f  hold the names o
18fa0 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f  f master.  ** jo
18fb0 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72  urnal files extr
18fc0 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c  acted from regul
18fd0 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72  ar rollback-jour
18fe0 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  nals..  */.  rc 
18ff0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
19000 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d  ize(pMaster, &nM
19010 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
19020 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19030 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
19040 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74  ter_out;.  nMast
19050 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78  erPtr = pVfs->mx
19060 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d  Pathname+1;.  zM
19070 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73  asterJournal = s
19080 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61  qlite3Malloc(nMa
19090 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d  sterJournal + nM
190a0 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20  asterPtr + 1);. 
190b0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
190c0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  rnal ){.    rc =
190d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
190e0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
190f0 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61  r_out;.  }.  zMa
19100 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74  sterPtr = &zMast
19110 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
19120 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72  rJournal+1];.  r
19130 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
19140 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(pMaster, zMast
19150 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29  erJournal, (int)
19160 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  nMasterJournal, 
19170 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
19180 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
19190 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
191a0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
191b0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d  MasterJournal] =
191c0 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20   0;..  zJournal 
191d0 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
191e0 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75  ;.  while( (zJou
191f0 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
19200 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
19210 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  nal ){.    int e
19220 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20  xists;.    rc = 
19230 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
19240 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
19250 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
19260 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
19270 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
19290 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
192a0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
192b0 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20   exists ){.     
192c0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
192d0 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
192e0 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
192f0 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
19300 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69  .      ** Open i
19310 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
19320 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
19330 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
19340 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  If.      ** so, 
19350 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
19360 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
19370 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
19380 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19390 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74  int c;.      int
193a0 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
193b0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
193c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
193d0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
193e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
193f0 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  en(pVfs, zJourna
19400 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61  l, pJournal, fla
19410 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  gs, 0);.      if
19420 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19430 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
19440 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
19450 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63       }..      rc
19460 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
19470 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
19480 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
19490 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71  erPtr);.      sq
194a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f  lite3OsClose(pJo
194b0 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  urnal);.      if
194c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
194d0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
194e0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
194f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20       }..      c 
19500 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21  = zMasterPtr[0]!
19510 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
19520 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
19530 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20  )==0;.      if( 
19540 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  c ){.        /* 
19550 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
19560 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
19570 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19580 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
19590 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
195a0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  r_out;.      }. 
195b0 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61     }.    zJourna
195c0 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72  l += (sqlite3Str
195d0 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b  len30(zJournal)+
195e0 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69  1);.  }. .  sqli
195f0 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74  te3OsClose(pMast
19600 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  er);.  rc = sqli
19610 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
19620 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a  , zMaster, 0);..
19630 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
19640 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
19650 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
19660 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a   if( pMaster ){.
19670 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
19680 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  se(pMaster);.   
19690 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
196a0 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20  (pJournal) );.  
196b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
196c0 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72  Master);.  }.  r
196d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
196e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
196f0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61  n is used to cha
19700 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73  nge the actual s
19710 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
19720 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20  ase .** file in 
19730 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
19740 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
19750 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ns when committi
19760 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
19770 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20  ,.** or rolling 
19780 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
19790 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f  on (including ro
197a0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
197b0 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a  -journal)..**.**
197c0 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   If the main dat
197d0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
197e0 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70  t open, or the p
197f0 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
19800 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f  ither.** DBMOD o
19810 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68  r OPEN state, th
19820 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
19830 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
19840 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20  e, the size .** 
19850 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  of the file is c
19860 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20  hanged to nPage 
19870 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61  pages (nPage*pPa
19880 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
19890 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65  tes). .** If the
198a0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
198b0 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65   currently large
198c0 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67  r than nPage pag
198d0 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65  es, then use the
198e0 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74   VFS.** xTruncat
198f0 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72  e() method to tr
19900 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  uncate it..**.**
19910 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65   Or, it might be
19920 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
19930 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
19940 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
19950 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
19960 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
19970 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
19980 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
19990 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
199a0 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
199b0 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
199c0 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
199d0 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
199e0 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
199f0 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
19a00 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
19a10 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
19a20 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
19a30 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
19a40 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
19a50 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
19a60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
19a70 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
19a80 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
19a90 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
19aa0 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
19ab0 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
19ac0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
19ad0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19ae0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
19af0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
19b00 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
19b10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19b20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19b30 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
19b40 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
19b50 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
19b60 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e!=PAGER_READER 
19b70 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70  );.  .  if( isOp
19b80 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  en(pPager->fd) .
19b90 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
19ba0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
19bb0 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
19bc0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
19bd0 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20  ER_OPEN) .  ){. 
19be0 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
19bf0 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
19c00 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50   int szPage = pP
19c10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
19c20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19c30 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
19c40 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
19c50 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
19c60 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
19c70 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
19c80 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
19c90 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19ca0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
19cb0 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
19cc0 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  newSize = szPage
19cd0 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
19ce0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19cf0 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
19d00 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
19d10 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
19d20 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
19d30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19d40 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
19d50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
19d60 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e);.      }else 
19d70 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65  if( (currentSize
19d80 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a  +szPage)<=newSiz
19d90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
19da0 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
19db0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
19dc0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
19dd0 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
19de0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19df0 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
19e00 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20   == currentSize 
19e10 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
19e20 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
19e30 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74  Page) >  current
19e40 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
19e50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
19e60 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
19e70 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65  pTmp, szPage, ne
19e80 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20  wSize-szPage);. 
19e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19ea0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19eb0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
19ec0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
19ed0 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
19ee0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19ef0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19f00 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64  turn a sanitized
19f10 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
19f20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f  sector-size of O
19f30 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68  S file pFile. Th
19f40 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
19f50 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
19f60 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33  to lie between 3
19f70 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52  2 and MAX_SECTOR
19f80 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _SIZE..*/.int sq
19f90 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28  lite3SectorSize(
19fa0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
19fb0 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74  ile){.  int iRet
19fc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
19fd0 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20  orSize(pFile);. 
19fe0 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a   if( iRet<32 ){.
19ff0 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a      iRet = 512;.
1a000 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74    }else if( iRet
1a010 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
1a020 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a030 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
1a040 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74  =512 );.    iRet
1a050 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
1a060 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
1a070 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iRet;.}../*.** 
1a080 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
1a090 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
1a0a0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
1a0b0 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
1a0c0 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
1a0d0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
1a0e0 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
1a0f0 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
1a100 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
1a110 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
1a120 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
1a130 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65  e used .** to de
1a140 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
1a150 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f   and alignment o
1a160 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
1a170 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20   and .** master 
1a180 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
1a190 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20   within created 
1a1a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
1a1b0 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
1a1c0 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66  ry files the eff
1a1d0 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1a1e0 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32  ze is always 512
1a1f0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   bytes..**.** Ot
1a200 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e  herwise, for non
1a210 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73  -temporary files
1a220 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  , the effective 
1a230 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a  sector size is.*
1a240 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  * the value retu
1a250 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
1a260 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64  torSize() method
1a270 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33   rounded up to 3
1a280 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65  2 if.** it is le
1a290 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72  ss than 32, or r
1a2a0 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d  ounded down to M
1a2b0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
1a2c0 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74  f it.** is great
1a2d0 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54  er than MAX_SECT
1a2e0 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49  OR_SIZE..**.** I
1a2f0 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 74  f the file has t
1a300 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  he SQLITE_IOCAP_
1a310 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1a320 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68  ITE property, th
1a330 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66  en set.** the ef
1a340 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1a350 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d  ize to its minim
1a360 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20  um value (512). 
1a370 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a   The purpose of.
1a380 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ** pPager->secto
1a390 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69  rSize is to defi
1a3a0 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20 72 61  ne the "blast ra
1a3b0 64 69 75 73 22 20 6f 66 20 62 79 74 65 73 20 74  dius" of bytes t
1a3c0 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
1a3d0 6e 67 65 20 69 66 20 61 20 63 72 61 73 68 20 6f  nge if a crash o
1a3e0 63 63 75 72 73 20 77 68 69 6c 65 20 77 72 69 74  ccurs while writ
1a3f0 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ing to a single 
1a400 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20  byte in.** that 
1a410 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68  range.  But with
1a420 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
1a430 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20  RITE, the blast 
1a440 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a  radius is zero.*
1a450 2a 20 28 74 68 61 74 20 69 73 20 77 68 61 74 20  * (that is what 
1a460 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1a470 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77  ITE means), so w
1a480 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73  e minimize the s
1a490 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20  ector.** size.  
1a4a0 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f  For backwards co
1a4b0 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74  mpatibility of t
1a4c0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1a4d0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c  nal file format,
1a4e0 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65  .** we cannot re
1a4f0 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
1a500 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62  ve sector size b
1a510 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61  elow 512..*/.sta
1a520 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
1a530 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
1a540 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
1a550 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1a560 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1a570 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66  empFile );..  if
1a580 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
1a590 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  le.   || (sqlite
1a5a0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1a5b0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1a5c0 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20 20 20  >fd) & .        
1a5d0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1a5e0 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1a5f0 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a  RWRITE)!=0.  ){.
1a600 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
1a610 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
1a620 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
1a630 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
1a640 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
1a650 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
1a660 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
1a670 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  ich case the OsS
1a680 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
1a690 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
1a6a0 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50  fault. */.    pP
1a6b0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1a6c0 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b   = 512;.  }else{
1a6d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
1a6e0 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
1a6f0 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  3SectorSize(pPag
1a700 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  er->fd);.  }.}..
1a710 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
1a720 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
1a730 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
1a740 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1a750 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
1a760 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
1a770 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
1a780 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
1a790 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
1a7a0 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
1a7b0 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
1a7c0 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
1a7d0 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
1a7e0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
1a7f0 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
1a800 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1a810 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1a820 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
1a830 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
1a840 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
1a850 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
1a860 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
1a870 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
1a880 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
1a890 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
1a8a0 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
1a8b0 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
1a8c0 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
1a8d0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1a8e0 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
1a8f0 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
1a900 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
1a910 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
1a920 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
1a930 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1a940 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1a950 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
1a960 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
1a970 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
1a980 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
1a990 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  5)  4 byte big-e
1a9a0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1a9b0 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f  ich is the secto
1a9c0 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61  r size.  The hea
1a9d0 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20  der.**       is 
1a9e0 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
1a9f0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29  in size..**  (6)
1aa00 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1aa10 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1aa20 68 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69  h is the page si
1aa30 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72  ze..**  (7)  zer
1aa40 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f  o padding out to
1aa50 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
1aa60 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20   size..**  (8)  
1aa70 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
1aa80 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
1aa90 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
1aaa0 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
1aab0 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
1aac0 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
1aad0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
1aae0 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
1aaf0 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
1ab00 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
1ab10 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
1ab20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1ab30 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
1ab40 20 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61   first 7 items a
1ab50 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
1ab60 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
1ab70 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
1ab80 65 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65  e of the 8th ite
1ab90 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
1aba0 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
1abb0 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
1abc0 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
1abd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
1abe0 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
1abf0 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
1ac00 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
1ac10 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
1ac20 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
1ac30 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
1ac40 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
1ac50 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
1ac60 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
1ac70 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
1ac80 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
1ac90 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
1aca0 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
1acb0 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
1acc0 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
1acd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
1ace0 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
1acf0 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
1ad00 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
1ad10 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
1ad20 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
1ad30 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
1ad40 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
1ad50 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
1ad60 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
1ad70 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
1ad80 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
1ad90 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
1ada0 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
1adb0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1adc0 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
1add0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
1ade0 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
1adf0 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
1ae00 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
1ae10 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
1ae20 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
1ae30 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
1ae40 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
1ae50 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
1ae60 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
1ae70 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1ae80 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
1ae90 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
1aea0 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
1aeb0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
1aec0 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
1aed0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1aee0 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
1aef0 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
1af00 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
1af10 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
1af20 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
1af30 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
1af40 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
1af50 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
1af60 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
1af70 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
1af80 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
1af90 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
1afa0 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
1afb0 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
1afc0 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
1afd0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
1afe0 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
1aff0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
1b000 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
1b010 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
1b020 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
1b030 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
1b040 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
1b050 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
1b060 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
1b070 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
1b080 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
1b090 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
1b0a0 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
1b0b0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1b0c0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
1b0d0 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65  e isHot paramete
1b0e0 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  r indicates that
1b0f0 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
1b100 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75  o rollback a jou
1b110 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67  rnal.** that mig
1b120 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72  ht be a hot jour
1b130 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75  nal.  Or, it cou
1b140 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a  ld be that the j
1b150 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72  ournal is .** pr
1b160 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20  eserved because 
1b170 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  of JOURNALMODE_P
1b180 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41  ERSIST or JOURNA
1b190 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a  LMODE_TRUNCATE..
1b1a0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
1b1b0 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c  l really is hot,
1b1c0 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72   reset the pager
1b1d0 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c   cache prior rol
1b1e0 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79  ling.** back any
1b1f0 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68   content.  If th
1b200 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72  e journal is mer
1b210 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20  ely persistent, 
1b220 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e  no reset is.** n
1b230 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
1b240 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
1b250 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
1b260 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
1b270 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1b280 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
1b290 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  s;.  i64 szJ;   
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b2b0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
1b2c0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
1b2d0 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
1b2e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b2f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
1b300 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
1b310 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b330 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
1b340 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1b350 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
1b360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1b370 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
1b380 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
1b390 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b3b0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
1b3c0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
1b3d0 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20    int res = 1;  
1b3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1b3f0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1b400 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1b410 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  ) */.  char *zMa
1b420 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
1b430 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
1b440 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
1b450 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  f any */.  int n
1b460 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20  eedPagerReset;  
1b470 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72      /* True to r
1b480 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20  eset page prior 
1b490 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f  to first page ro
1b4a0 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  llback */.  int 
1b4b0 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20  nPlayback = 0;  
1b4c0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
1b4d0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65  mber of pages re
1b4e0 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72  stored from jour
1b4f0 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  nal */..  /* Fig
1b500 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
1b510 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
1b520 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
1b530 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
1b540 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
1b550 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
1b560 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1b570 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
1b580 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1b590 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
1b5a0 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
1b5b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b5c0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1b5d0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
1b5e0 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
1b5f0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
1b600 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1b610 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
1b620 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
1b630 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1b640 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
1b650 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
1b660 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
1b670 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
1b680 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1b690 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
1b6a0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1b6b0 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
1b6c0 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
1b6d0 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
1b6e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
1b6f0 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
1b700 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
1b710 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
1b720 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
1b730 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
1b740 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
1b750 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
1b760 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
1b770 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
1b780 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1b790 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
1b7a0 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68  .c,.  **  mxPath
1b7b0 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
1b7c0 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
1b7d0 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
1b7e0 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
1b7f0 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
1b800 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
1b810 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1b820 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
1b830 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1b840 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1b850 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1b860 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1b870 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b880 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1b890 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
1b8a0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1b8b0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
1b8c0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1b8d0 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
1b8e0 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
1b8f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b900 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
1b910 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b920 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
1b930 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1b940 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
1b950 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
1b960 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
1b970 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
1b980 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
1b990 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
1b9a0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
1b9b0 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
1b9c0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1b9d0 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
1b9e0 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
1b9f0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
1ba00 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ){.    /* Read t
1ba10 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
1ba20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
1ba30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
1ba40 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
1ba50 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
1ba60 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
1ba70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1ba80 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
1ba90 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
1baa0 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
1bab0 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
1bac0 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  st have failed w
1bad0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
1bae0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
1baf0 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
1bb00 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
1bb10 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
1bb20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
1bb30 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
1bb40 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20  er, isHot, szJ, 
1bb50 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
1bb60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1bb70 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
1bb80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
1bb90 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
1bba0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1bbb0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1bbc0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1bbd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1bbe0 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
1bbf0 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
1bc00 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
1bc10 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
1bc20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
1bc30 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
1bc40 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
1bc50 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
1bc60 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
1bc70 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
1bc80 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
1bc90 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
1bca0 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
1bcb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
1bcc0 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
1bcd0 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
1bce0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1bcf0 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
1bd00 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
1bd10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1bd20 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1bd30 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1bd40 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
1bd50 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55  (int)((szJ - JOU
1bd60 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1bd70 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
1bd80 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1bd90 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1bda0 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
1bdb0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
1bdc0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
1bdd0 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
1bde0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
1bdf0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1be00 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
1be10 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
1be20 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
1be30 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
1be40 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1be50 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
1be60 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
1be70 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
1be80 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
1be90 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
1bea0 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
1beb0 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
1bec0 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
1bed0 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
1bee0 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
1bef0 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
1bf00 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
1bf10 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
1bf20 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f  ..    ** When ro
1bf30 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
1bf40 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d   journal, nRec==
1bf50 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74  0 always means t
1bf60 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20  hat the next.   
1bf70 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65   ** chunk of the
1bf80 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
1bf90 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20  s zero pages to 
1bfa0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1bfb0 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e   But.    ** when
1bfc0 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43   doing a ROLLBAC
1bfd0 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d  K and the nRec==
1bfe0 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c  0 chunk is the l
1bff0 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20  ast chunk in.   
1c000 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   ** the journal,
1c010 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1c020 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1c030 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f   contain additio
1c040 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73  nal.    ** pages
1c050 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1c060 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
1c070 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
1c080 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a   of pages .    *
1c090 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  * should be comp
1c0a0 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  uted based on th
1c0b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
1c0c0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1c0d0 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
1c0e0 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
1c0f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c100 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
1c110 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
1c120 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
1c130 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
1c140 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  int)((szJ - pPag
1c150 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
1c160 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
1c170 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1c180 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1c190 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
1c1a0 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
1c1b0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
1c1c0 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
1c1d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
1c1e0 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
1c1f0 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
1c200 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1c210 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1c220 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1c230 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1c240 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1c250 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
1c260 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c270 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c280 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1c290 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
1c2a0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1c2b0 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
1c2c0 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
1c2d0 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
1c2e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
1c2f0 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
1c300 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1c310 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67   file and/or pag
1c320 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a  e cache..    */.
1c330 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e      for(u=0; u<n
1c340 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20  Rec; u++){.     
1c350 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65   if( needPagerRe
1c360 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  set ){.        p
1c370 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1c380 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64  r);.        need
1c390 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a  PagerReset = 0;.
1c3a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1c3b0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1c3c0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
1c3d0 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r,&pPager->journ
1c3e0 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20  alOff,0,1,0);.  
1c3f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c410 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20   nPlayback++;.  
1c420 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c430 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c440 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1c450 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1c460 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
1c470 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c480 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1c490 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1c4a0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1c4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1c4c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
1c4d0 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20  been truncated, 
1c4e0 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64  simply stop read
1c4f0 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ing and.        
1c500 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1c510 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69  the journal. Thi
1c520 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69  s might happen i
1c530 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1c540 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  s.          ** n
1c550 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72  ot completely wr
1c560 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64  itten and synced
1c570 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73   prior to a cras
1c580 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20  h.  In that.    
1c590 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74        ** case, t
1c5a0 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
1c5b0 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65  ld have never be
1c5c0 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  en written in th
1c5d0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  e.          ** f
1c5e0 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74  irst place so it
1c5f0 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79   is OK to simply
1c600 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c   abandon the rol
1c610 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20  lback. */.      
1c620 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c630 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
1c640 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c650 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1c660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1c670 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
1c680 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
1c690 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
1c6a0 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
1c6b0 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
1c6c0 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
1c6d0 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
1c6e0 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
1c6f0 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
1c700 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
1c710 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
1c720 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
1c730 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1c740 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
1c750 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
1c760 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1c770 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
1c780 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1c790 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1c7a0 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
1c7b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c7c0 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
1c7d0 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
1c7e0 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
1c7f0 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61    /* Following a
1c800 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64   rollback, the d
1c810 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
1c820 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69  uld be back in i
1c830 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
1c840 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20   state prior to 
1c850 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1c860 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f   transaction, so
1c870 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
1c880 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
1c890 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d  _UNCHANGED file-
1c8a0 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74  control method t
1c8b0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20  o disable the.  
1c8c0 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61  ** assertion tha
1c8d0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1c8e0 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f  n counter was mo
1c8f0 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66  dified..  */.#if
1c900 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1c910 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
1c920 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
1c930 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
1c940 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
1c950 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43  er->fd,SQLITE_FC
1c960 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1c970 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ,0);.  }.#endif.
1c980 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c  .  /* If this pl
1c990 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e  ayback is happen
1c9a0 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ing automaticall
1c9b0 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  y as a result of
1c9c0 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20   an IO or .  ** 
1c9d0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61  malloc error tha
1c9e0 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72  t occurred after
1c9f0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1ca00 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
1ca10 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65  but .  ** before
1ca20 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1ca30 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20   was committed, 
1ca40 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d  then the change-
1ca50 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f  counter .  ** mo
1ca60 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a  dification may j
1ca70 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  ust have been re
1ca80 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20  verted. If this 
1ca90 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75  happens in exclu
1caa0 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c  sive .  ** mode,
1cab0 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74   then subsequent
1cac0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65   transactions pe
1cad0 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63  rformed by the c
1cae0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e  onnection will n
1caf0 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74  ot.  ** update t
1cb00 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1cb10 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d  r at all. This m
1cb20 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65  ay lead to cache
1cb30 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20   inconsistency. 
1cb40 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72   ** problems for
1cb50 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1cb60 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   at some point i
1cb70 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f  n the future. So
1cb80 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63  , just.  ** in c
1cb90 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70  ase this has hap
1cba0 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65  pened, clear the
1cbb0 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
1cbc0 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a   flag now..  */.
1cbd0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
1cbe0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
1cbf0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
1cc00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cc10 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65  OK ){.    zMaste
1cc20 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1cc30 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20  Space;.    rc = 
1cc40 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
1cc50 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
1cc60 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
1cc70 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1cc80 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  +1);.    testcas
1cc90 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1cca0 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
1ccb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
1ccc0 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
1ccd0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
1cce0 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
1ccf0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1cd00 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  PEN).  ){.    rc
1cd10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1cd20 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ync(pPager, 0);.
1cd30 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1cd40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1cd50 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
1cd60 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1cd70 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c  , zMaster[0]!='\
1cd80 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74  0', 0);.    test
1cd90 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1cda0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1cdb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1cdc0 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20  & zMaster[0] && 
1cdd0 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
1cde0 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
1cdf0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
1ce00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1ce10 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  l return success
1ce20 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
1ce30 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
1ce40 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
1ce50 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
1ce60 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1ce70 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61  er_delmaster(pPa
1ce80 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1ce90 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1cea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1ceb0 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26 26  }.  if( isHot &&
1cec0 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20   nPlayback ){.  
1ced0 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
1cee0 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
1cef0 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72  VER_ROLLBACK, "r
1cf00 65 63 6f 76 65 72 65 64 20 25 64 20 70 61 67 65  ecovered %d page
1cf10 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20  s from %s",.    
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61              nPla
1cf30 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a  yback, pPager->z
1cf40 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20  Journal);.  }.. 
1cf50 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
1cf60 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
1cf70 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
1cf80 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
1cf90 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
1cfa0 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
1cfb0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
1cfc0 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
1cfd0 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
1cfe0 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
1cff0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
1d000 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
1d010 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
1d020 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
1d030 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
1d040 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  c;.}.../*.** Rea
1d050 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  d the content fo
1d060 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  r page pPg out o
1d070 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1d080 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a  ile and into .**
1d090 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73   pPg->pData. A s
1d0a0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72  hared lock or gr
1d0b0 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
1d0c0 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
1d0d0 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72  se.** file befor
1d0e0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1d0f0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1d100 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65   If page 1 is re
1d110 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ad, then the val
1d120 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
1d130 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20  leVers[] is set 
1d140 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  to.** the value 
1d150 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
1d160 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1d170 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
1d180 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
1d190 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72  he IO error is r
1d1a0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
1d1b0 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77  aller..** Otherw
1d1c0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
1d1d0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1d1e0 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
1d1f0 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c  Page(PgHdr *pPg,
1d200 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20   u32 iFrame){.  
1d210 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1d220 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20  pPg->pPager; /* 
1d230 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73  Pager object ass
1d240 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
1d250 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  e pPg */.  Pgno 
1d260 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
1d270 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ;       /* Page 
1d280 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a  number to read *
1d290 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1d2a0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1d2b0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1d2c0 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20  */.  int pgsz = 
1d2d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1d2e0 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ; /* Number of b
1d2f0 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a  ytes to read */.
1d300 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1d310 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1d320 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44  _READER && !MEMD
1d330 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  B );.  assert( i
1d340 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1d350 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) );..#ifndef SQ
1d360 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
1d370 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20  if( iFrame ){.  
1d380 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c    /* Try to pull
1d390 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1d3a0 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  he write-ahead l
1d3b0 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  og. */.    rc = 
1d3c0 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72  sqlite3WalReadFr
1d3d0 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
1d3e0 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20  , iFrame, pgsz, 
1d3f0 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d  pPg->pData);.  }
1d400 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
1d410 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20      i64 iOffset 
1d420 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
1d430 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1d440 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1d450 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1d460 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
1d470 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b   pgsz, iOffset);
1d480 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d490 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1d4a0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
1d4b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d4c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1d4d0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66  gno==1 ){.    if
1d4e0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
1d4f0 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20   If the read is 
1d500 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  unsuccessful, se
1d510 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73  t the dbFileVers
1d520 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  [] to something.
1d530 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69        ** that wi
1d540 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61  ll never be a va
1d550 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  lid file version
1d560 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  .  dbFileVers[] 
1d570 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20  is a copy.      
1d580 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e  ** of bytes 24..
1d590 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1d5a0 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33  se.  Bytes 28..3
1d5b0 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  1 should always 
1d5c0 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  be.      ** zero
1d5d0 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20   or the size of 
1d5e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1d5f0 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e  page. Bytes 32..
1d600 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20  35 and 35..39.  
1d610 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1d620 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68   page numbers wh
1d630 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78  ich are never 0x
1d640 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69  ffffffff.  So fi
1d650 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  lling.      ** p
1d660 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d670 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66  s[] with all 0xf
1d680 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73  f bytes should s
1d690 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a  uffice..      **
1d6a0 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e  .      ** For an
1d6b0 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
1d6c0 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69  ase, the situati
1d6d0 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c  on is more compl
1d6e0 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20  ex:  bytes.     
1d6f0 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68   ** 24..39 of th
1d700 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  e database are w
1d710 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74  hite noise.  But
1d720 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
1d730 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69   of.      ** whi
1d740 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e  te noise equalin
1d750 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78  g 16 bytes of 0x
1d760 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c  ff is vanishingl
1d770 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20  y small so.     
1d780 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74   ** we should st
1d790 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20  ill be ok..     
1d7a0 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   */.      memset
1d7b0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1d7c0 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f  ers, 0xff, sizeo
1d7d0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1d7e0 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Vers));.    }els
1d7f0 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46  e{.      u8 *dbF
1d800 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a  ileVers = &((u8*
1d810 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
1d820 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
1d830 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d840 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1d850 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1d860 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1d870 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28   }.  }.  CODEC1(
1d880 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
1d890 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
1d8a0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  = SQLITE_NOMEM);
1d8b0 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
1d8c0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
1d8d0 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
1d8e0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1d8f0 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
1d900 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
1d910 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1d920 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
1d930 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
1d940 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1d950 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1d960 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1d970 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1d980 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
1d990 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d9a0 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
1d9b0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
1d9c0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1d9d0 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20   offsets 24 and 
1d9e0 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61  92 in.** the hea
1d9f0 64 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69  der and the sqli
1da00 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1da10 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a  r at offset 96..
1da20 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
1da30 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75   unconditional u
1da40 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f  pdate.  See also
1da50 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f   the pager_incr_
1da60 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a  changecounter().
1da70 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68  ** routine which
1da80 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68   only updates th
1da90 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1daa0 20 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69   if the update i
1dab0 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65  s actually.** ne
1dac0 65 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69  eded, as determi
1dad0 6e 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65  ned by the pPage
1dae0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1daf0 6e 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c  ne state variabl
1db00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1db10 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  d pager_write_ch
1db20 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64  angecounter(PgHd
1db30 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63  r *pPg){.  u32 c
1db40 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a  hange_counter;..
1db50 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1db60 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
1db70 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
1db80 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
1db90 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75   */.  change_cou
1dba0 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
1dbb0 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d  t4byte((u8*)pPg-
1dbc0 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  >pPager->dbFileV
1dbd0 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62  ers)+1;.  put32b
1dbe0 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1dbf0 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e  >pData)+24, chan
1dc00 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
1dc10 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68  /* Also store th
1dc20 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  e SQLite version
1dc30 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73   number in bytes
1dc40 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20   96..99 and in. 
1dc50 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35   ** bytes 92..95
1dc60 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67   store the chang
1dc70 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68  e counter for wh
1dc80 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20  ich the version 
1dc90 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76  number.  ** is v
1dca0 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32  alid. */.  put32
1dcb0 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1dcc0 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61  ->pData)+92, cha
1dcd0 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20  nge_counter);.  
1dce0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1dcf0 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36  *)pPg->pData)+96
1dd00 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  , SQLITE_VERSION
1dd10 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66  _NUMBER);.}..#if
1dd20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1dd30 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _WAL./*.** This 
1dd40 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
1dd50 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
1dd60 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
1dd70 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
1dd80 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1dd90 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
1dda0 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1ddb0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1ddc0 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
1ddd0 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
1dde0 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
1ddf0 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
1de00 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
1de10 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
1de20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
1de30 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
1de40 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
1de50 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
1de60 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
1de70 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1de80 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
1de90 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
1dea0 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
1deb0 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
1dec0 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
1ded0 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
1dee0 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
1def0 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
1df00 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
1df10 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
1df20 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
1df30 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
1df40 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
1df50 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
1df60 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1df70 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
1df80 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
1df90 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1dfa0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
1dfb0 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
1dfc0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1dfd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1dfe0 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
1dff0 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
1e000 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
1e010 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1e020 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67  pPager) );.  pPg
1e030 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
1e040 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50  ookup(pPager, iP
1e050 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g);.  if( pPg ){
1e060 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1e070 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
1e080 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20  nt(pPg)==1 ){.  
1e090 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
1e0a0 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20  eDrop(pPg);.    
1e0b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32  }else{.      u32
1e0c0 20 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20   iFrame = 0;.   
1e0d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
1e0e0 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67  alFindFrame(pPag
1e0f0 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70  er->pWal, pPg->p
1e100 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20  gno, &iFrame);. 
1e110 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e120 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e130 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1e140 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a  e(pPg, iFrame);.
1e150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e160 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e170 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1e180 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
1e190 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e1a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1e1b0 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
1e1c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1e1d0 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74  Normally, if a t
1e1e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1e1f0 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62  lled back, any b
1e200 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
1e210 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64  are.  ** updated
1e220 20 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69   as data is copi
1e230 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f  ed out of the ro
1e240 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
1e250 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  nd into the.  **
1e260 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
1e270 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79  is not generally
1e280 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61   possible with a
1e290 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61   WAL database, a
1e2a0 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  s.  ** rollback 
1e2b0 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20  involves simply 
1e2c0 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c  truncating the l
1e2d0 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f  og file. Therefo
1e2e0 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20  re, if one.  ** 
1e2f0 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68  or more frames h
1e300 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
1e310 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1e320 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f  log (and therefo
1e330 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f  re .  ** also co
1e340 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61  pied into the ba
1e350 63 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20  ckup databases) 
1e360 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  as part of this 
1e370 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a  transaction,.  *
1e380 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75  * the backups mu
1e390 73 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e  st be restarted.
1e3a0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
1e3b0 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
1e3c0 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a  ger->pBackup);..
1e3d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e3e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1e3f0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1e400 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   rollback a tran
1e410 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c  saction on a WAL
1e420 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1e430 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f  atic int pagerRo
1e440 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20  llbackWal(Pager 
1e450 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1e460 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1e470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e480 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
1e490 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20  PgHdr *pList;   
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4b0 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79  /* List of dirty
1e4c0 20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74   pages to revert
1e4d0 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c   */..  /* For al
1e4e0 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  l pages in the c
1e4f0 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75  ache that are cu
1e500 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72  rrently dirty or
1e510 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
1e520 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
1e530 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74  (but not committ
1e540 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66  ed) to the log f
1e550 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74  ile, do one of t
1e560 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  he .  ** followi
1e570 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ng:.  **.  **   
1e580 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61  + Discard the ca
1e590 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65  ched page (if re
1e5a0 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20  fcount==0), or. 
1e5b0 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70   **   + Reload p
1e5c0 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  age content from
1e5d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
1e5e0 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20  f refcount>0).. 
1e5f0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
1e600 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1e610 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20  bOrigSize;.  rc 
1e620 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f  = sqlite3WalUndo
1e630 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1e640 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1e650 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
1e660 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  );.  pList = sql
1e670 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
1e680 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
1e690 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  che);.  while( p
1e6a0 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  List && rc==SQLI
1e6b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48  TE_OK ){.    PgH
1e6c0 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
1e6d0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72  t->pDirty;.    r
1e6e0 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  c = pagerUndoCal
1e6f0 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50  lback((void *)pP
1e700 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
1e710 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  o);.    pList = 
1e720 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNext;.  }..  re
1e730 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e740 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1e750 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
1e760 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72  und sqlite3WalFr
1e770 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20  ames(). As well 
1e780 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68  as logging.** th
1e790 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1e7a0 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1e7b0 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20  headed by pList 
1e7c0 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44  (connected by pD
1e7d0 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66  irty),.** this f
1e7e0 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73  unction notifies
1e7f0 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b   any active back
1e800 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61  up processes tha
1e810 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65  t the pages have
1e820 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  .** changed. .**
1e830 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20  .** The list of 
1e840 70 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74  pages passed int
1e850 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1e860 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20  s always sorted 
1e870 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  by page number..
1e880 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67  ** Hence, if pag
1e890 65 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77  e 1 appears anyw
1e8a0 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  here on the list
1e8b0 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65  , it will be the
1e8c0 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20   first page..*/ 
1e8d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1e8e0 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61  rWalFrames(.  Pa
1e8f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e910 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
1e920 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c  .  PgHdr *pList,
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e940 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
1e950 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20  ames to log */. 
1e960 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c   Pgno nTruncate,
1e970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e980 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
1e990 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d  e after this com
1e9a0 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  mit */.  int isC
1e9b0 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
1e9c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e9d0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f   if this is a co
1e9e0 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mmit */.){.  int
1e9f0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ea10 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1ea20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20   int nList;     
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1ea50 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a  ges in pList */.
1ea60 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1ea90 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a   over pages */..
1eaa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1eab0 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65  ->pWal );.  asse
1eac0 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66  rt( pList );.#if
1ead0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1eae0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
1eaf0 74 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20  t the page list 
1eb00 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  is in accending 
1eb10 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70  order */.  for(p
1eb20 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e  =pList; p && p->
1eb30 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69  pDirty; p=p->pDi
1eb40 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74  rty){.    assert
1eb50 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70  ( p->pgno < p->p
1eb60 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20  Dirty->pgno );. 
1eb70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1eb80 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72  ert( pList->pDir
1eb90 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69  ty==0 || isCommi
1eba0 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d  t );.  if( isCom
1ebb0 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  mit ){.    /* If
1ebc0 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69   a WAL transacti
1ebd0 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  on is being comm
1ebe0 69 74 74 65 64 2c 20 74 68 65 72 65 20 69 73 20  itted, there is 
1ebf0 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74  no point in writ
1ec00 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70  ing.    ** any p
1ec10 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e  ages with page n
1ec20 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74  umbers greater t
1ec30 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e  han nTruncate in
1ec40 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e  to the WAL file.
1ec50 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c  .    ** They wil
1ec60 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  l never be read 
1ec70 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53  by any client. S
1ec80 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  o remove them fr
1ec90 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20 20  om the pDirty.  
1eca0 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20    ** list here. 
1ecb0 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70  */.    PgHdr **p
1ecc0 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a  pNext = &pList;.
1ecd0 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20      nList = 0;. 
1ece0 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1ecf0 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30  (*ppNext = p)!=0
1ed00 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1ed10 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
1ed20 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a  o<=nTruncate ){.
1ed30 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d          ppNext =
1ed40 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   &p->pDirty;.   
1ed50 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20       nList++;.  
1ed60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1ed70 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b  assert( pList );
1ed80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
1ed90 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70  ist = 1;.  }.  p
1eda0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
1edb0 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b  ER_STAT_WRITE] +
1edc0 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  = nList;..  if( 
1edd0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
1ede0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1edf0 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
1ee00 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1ee10 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  3WalFrames(pPage
1ee20 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20  r->pWal, .      
1ee30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1ee40 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61  , pList, nTrunca
1ee50 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50  te, isCommit, pP
1ee60 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
1ee70 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1ee80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1ee90 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1eea0 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  {.    for(p=pLis
1eeb0 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1eec0 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y){.      sqlite
1eed0 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
1eee0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
1eef0 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d  ->pgno, (u8 *)p-
1ef00 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >pData);.    }. 
1ef10 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1ef20 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1ef30 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
1ef40 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
1ef50 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1ef60 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1ef70 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1ef80 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
1ef90 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a  agehash(p);.  }.
1efa0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1efb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
1efc0 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73  gin a read trans
1efd0 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41  action on the WA
1efe0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
1eff0 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65  utine used to be
1f000 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70   called "pagerOp
1f010 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65  enSnapshot()" be
1f020 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69  cause it essenti
1f030 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20  ally.** makes a 
1f040 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20  snapshot of the 
1f050 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20  database at the 
1f060 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e  current point in
1f070 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72   time and preser
1f080 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70  ves.** that snap
1f090 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20  shot for use by 
1f0a0 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70  the reader in sp
1f0b0 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e  ite of concurren
1f0c0 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a  tly changes by.*
1f0d0 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20  * other writers 
1f0e0 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73  or checkpointers
1f0f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f100 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
1f110 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
1f120 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1f130 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1f140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f150 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1f160 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b  int changed = 0;
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f180 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
1f190 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a   must be reset *
1f1a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  /..  assert( pag
1f1b0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1f1c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1f1d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1f1e0 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
1f1f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1f200 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f  R_READER );..  /
1f210 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52  * sqlite3WalEndR
1f220 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  eadTransaction()
1f230 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
1f240 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
1f250 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1f260 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  n in locking_mod
1f270 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f  e=EXCLUSIVE.  So
1f280 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49   call it now.  I
1f290 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e  f we.  ** are in
1f2a0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f   locking_mode=NO
1f2b0 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64  RMAL and EndRead
1f2c0 28 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  () was previousl
1f2d0 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74  y called,.  ** t
1f2e0 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c  he duplicate cal
1f2f0 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20  l is harmless.. 
1f300 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   */.  sqlite3Wal
1f310 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
1f320 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
1f330 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1f340 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61  3WalBeginReadTra
1f350 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
1f360 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29  >pWal, &changed)
1f370 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1f380 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64  TE_OK || changed
1f390 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65   ){.    pager_re
1f3a0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1f3b0 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50   if( USEFETCH(pP
1f3c0 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f  ager) ) sqlite3O
1f3d0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
1f3e0 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  >fd, 0, 0);.  }.
1f3f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f400 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1f410 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1f420 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
1f430 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   the transition 
1f440 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a  from PAGER_OPEN.
1f450 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  ** to PAGER_READ
1f460 45 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65  ER state to dete
1f470 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f  rmine the size o
1f480 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1f490 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ile.** in pages 
1f4a0 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61  (assuming the pa
1f4b0 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c  ge size currentl
1f4c0 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  y stored in Page
1f4d0 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a  r.pageSize)..**.
1f4e0 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
1f4f0 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
1f500 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1f510 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1f520 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
1f530 70 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20  pages is stored 
1f540 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65  in *pnPage. Othe
1f550 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
1f560 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a  code (perhaps.**
1f570 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1f580 54 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64  TAT) is returned
1f590 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
1f5a0 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e  left unmodified.
1f5b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f5c0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
1f5d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1f5e0 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67  o *pnPage){.  Pg
1f5f0 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f610 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
1f620 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a   via *pnPage */.
1f630 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20  .  /* Query the 
1f640 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66  WAL sub-system f
1f650 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1f660 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73  size. The WalDbs
1f670 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74  ize().  ** funct
1f680 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ion returns zero
1f690 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e   if the WAL is n
1f6a0 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61  ot open (i.e. Pa
1f6b0 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72  ger.pWal==0), or
1f6c0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74  .  ** if the dat
1f6d0 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
1f6e0 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  t available. The
1f6f0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1f700 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c  s not.  ** avail
1f710 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41  able from the WA
1f720 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20  L sub-system if 
1f730 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  the log file is 
1f740 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f  empty or.  ** co
1f750 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20  ntains no valid 
1f760 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
1f770 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61  ctions..  */.  a
1f780 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1f790 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1f7a0 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
1f7b0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
1f7c0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e  ARED_LOCK );.  n
1f7d0 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61  Page = sqlite3Wa
1f7e0 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  lDbsize(pPager->
1f7f0 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  pWal);..  /* If 
1f800 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1f810 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
1f820 61 73 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ase is not avail
1f830 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20  able from the.  
1f840 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  ** WAL sub-syste
1f850 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  m, determine the
1f860 20 70 61 67 65 20 63 6f 75 6e 74 65 20 62 61 73   page counte bas
1f870 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f  ed on the size o
1f880 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
1f890 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1f8a0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1f8b0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
1f8c0 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67  ot an.  ** integ
1f8d0 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
1f8e0 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f  he page-size, ro
1f8f0 75 6e 64 20 75 70 20 74 68 65 20 72 65 73 75 6c  und up the resul
1f900 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  t..  */.  if( nP
1f910 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36  age==0 ){.    i6
1f920 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  4 n = 0;        
1f930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1f940 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69  ize of db file i
1f950 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61  n bytes */.    a
1f960 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1f970 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1f980 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1f990 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
1f9a0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
1f9b0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71       int rc = sq
1f9c0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1f9d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b  pPager->fd, &n);
1f9e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1f9f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fa00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1fa10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1fa20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28   nPage = (Pgno)(
1fa30 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (n+pPager->pageS
1fa40 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d  ize-1) / pPager-
1fa50 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
1fa60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
1fa70 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70  rent number of p
1fa80 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
1fa90 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1faa0 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67   the.  ** config
1fab0 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67  ured maximum pag
1fac0 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65  er number, incre
1fad0 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  ase the allowed 
1fae0 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68  limit so.  ** th
1faf0 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20  at the file can 
1fb00 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  be read..  */.  
1fb10 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72  if( nPage>pPager
1fb20 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
1fb30 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
1fb40 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20   (Pgno)nPage;.  
1fb50 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  }..  *pnPage = n
1fb60 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
1fb70 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1fb80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fb90 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  _WAL./*.** Check
1fba0 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   if the *-wal fi
1fbb0 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  le that correspo
1fbc0 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nds to the datab
1fbd0 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50  ase opened by pP
1fbe0 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69  ager.** exists i
1fbf0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1fc00 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76  s not empy, or v
1fc10 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a  erify that the *
1fc20 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  -wal file does.*
1fc30 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20  * not exist (by 
1fc40 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20  deleting it) if 
1fc50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fc60 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  e is empty..**.*
1fc70 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1fc80 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61  e is not empty a
1fc90 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  nd the *-wal fil
1fca0 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74  e exists, open t
1fcb0 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57  he pager.** in W
1fcc0 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65  AL mode.  If the
1fcd0 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70   database is emp
1fce0 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61  ty or if no *-wa
1fcf0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
1fd00 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72  d.** if no error
1fd10 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75   occurs, make su
1fd20 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  re Pager.journal
1fd30 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20  Mode is not set 
1fd40 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  to.** PAGER_JOUR
1fd50 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a  NALMODE_WAL..**.
1fd60 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1fd70 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  _OK or an error 
1fd80 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
1fd90 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64  caller must hold
1fda0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f   a SHARED lock o
1fdb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1fdc0 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ile to call this
1fdd0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65  .** function. Be
1fde0 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49  cause an EXCLUSI
1fdf0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
1fe00 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  b file is requir
1fe10 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a  ed to delete .**
1fe20 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65   a WAL on a none
1fe30 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c  -empty database,
1fe40 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   this ensures th
1fe50 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63  ere is no race c
1fe60 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74  ondition .** bet
1fe70 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73  ween the xAccess
1fe80 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20  () below and an 
1fe90 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20  xDelete() being 
1fea0 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65  executed by some
1feb0 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65   .** other conne
1fec0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1fed0 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61   int pagerOpenWa
1fee0 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72  lIfPresent(Pager
1fef0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1ff00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ff10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ff20 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1ff30 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
1ff40 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
1ff50 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
1ff60 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
1ff70 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
1ff80 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20   int isWal;     
1ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ffa0 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69  * True if WAL fi
1ffb0 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
1ffc0 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ffe0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * Size of the da
1fff0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
20000 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
20010 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
20020 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  &nPage);.    if(
20030 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
20040 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  .    if( nPage==
20050 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
20060 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
20070 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
20080 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a  ager->zWal, 0);.
20090 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
200a0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
200b0 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53  E_NOENT ) rc = S
200c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
200d0 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  isWal = 0;.    }
200e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
200f0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
20100 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  (.          pPag
20110 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
20120 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ->zWal, SQLITE_A
20130 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69  CCESS_EXISTS, &i
20140 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20  sWal.      );.  
20150 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
20160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20170 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a     if( isWal ){.
20180 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
20190 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  ( sqlite3PcacheP
201a0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
201b0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
201c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
201d0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
201e0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
201f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
20200 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
20210 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
20220 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  ODE_WAL ){.     
20230 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
20240 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
20250 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
20260 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
20270 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20280 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
20290 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70  * Playback savep
202a0 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e  oint pSavepoint.
202b0 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69   Or, if pSavepoi
202c0 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70  nt==NULL, then p
202d0 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65  layback.** the e
202e0 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
202f0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63  rnal file. The c
20300 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d  ase pSavepoint==
20310 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e  NULL occurs when
20320 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20   .** a ROLLBACK 
20330 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e  TO command is in
20340 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50  voked on a SAVEP
20350 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74  OINT that is a t
20360 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73  ransaction .** s
20370 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
20380 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20  When pSavepoint 
20390 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61  is not NULL (mea
203a0 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73  ning a non-trans
203b0 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
203c0 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f   is .** being ro
203d0 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e  lled back), then
203e0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f   the rollback co
203f0 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20  nsists of up to 
20400 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a  three stages,.**
20410 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68   performed in th
20420 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65  e order specifie
20430 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  d:.**.**   * Pag
20440 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  es are played ba
20450 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
20460 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
20470 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  g at byte.**    
20480 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76   offset PagerSav
20490 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
204a0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
204b0 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
204c0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
204d0 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e  et, or to the en
204e0 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
204f0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
20500 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f  e if PagerSavepo
20510 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
20520 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20  s zero..**.**   
20530 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f  * If PagerSavepo
20540 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
20550 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
20560 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   pages are playe
20570 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74  d.**     back st
20580 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  arting from the 
20590 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
205a0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
205b0 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67  wing .**     Pag
205c0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
205d0 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e  Offset to the en
205e0 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
205f0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
20600 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
20610 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  then played back
20620 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
20630 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72  urnal file, star
20640 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68  ting.**     with
20650 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
20660 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20  int.iSubRec and 
20670 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
20680 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20  e end of.**     
20690 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
206a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f  ..**.** Througho
206b0 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ut the rollback 
206c0 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69  process, each ti
206d0 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c  me a page is rol
206e0 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a  led back, the.**
206f0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
20700 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62  it is set in a b
20710 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
20720 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20  (variable pDone 
20730 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d  in the.** implem
20740 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e  entation below).
20750 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
20760 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70   ensure that a p
20770 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72  age is only.** r
20780 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66  olled back the f
20790 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20  irst time it is 
207a0 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65  encountered in e
207b0 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ither journal..*
207c0 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69  *.** If pSavepoi
207d0 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
207e0 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20   pages are only 
207f0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
20800 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
20810 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
20820 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
20830 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73  a bitvec in this
20840 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   case..**.** In 
20850 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66  either case, bef
20860 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d  ore playback com
20870 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72  mences the Pager
20880 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65  .dbSize variable
20890 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20  .** is reset to 
208a0 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69  the value that i
208b0 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74  t held at the st
208c0 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70  art of the savep
208d0 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61  oint .** (or tra
208e0 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61  nsaction). No pa
208f0 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e  ge with a page-n
20900 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
20910 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  an this value.**
20920 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   is played back.
20930 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75   If one is encou
20940 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d  ntered it is sim
20950 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  ply skipped..*/.
20960 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
20970 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
20980 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
20990 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
209a0 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20  *pSavepoint){.  
209b0 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
209c0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65           /* Effe
209d0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
209e0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  e main journal *
209f0 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20a10 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67  End of first seg
20a20 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75  ment of main-jou
20a30 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a  rnal records */.
20a40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20a50 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
20a60 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
20a70 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30  itvec *pDone = 0
20a80 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65  ;       /* Bitve
20a90 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65  c to ensure page
20aa0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e  s played back on
20ab0 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73  ly once */..  as
20ac0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
20ad0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
20ae0 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
20af0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
20b00 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
20b10 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ED );..  /* Allo
20b20 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f  cate a bitvec to
20b30 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68   use to store th
20b40 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72  e set of pages r
20b50 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  olled back */.  
20b60 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
20b70 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71  {.    pDone = sq
20b80 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
20b90 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  e(pSavepoint->nO
20ba0 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70  rig);.    if( !p
20bb0 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Done ){.      re
20bc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
20bd0 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  M;.    }.  }..  
20be0 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62  /* Set the datab
20bf0 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f  ase size back to
20c00 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61   the value it wa
20c10 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76  s before the sav
20c20 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69  epoint .  ** bei
20c30 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20  ng reverted was 
20c40 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
20c50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
20c60 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61  pSavepoint ? pSa
20c70 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a  vepoint->nOrig :
20c80 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
20c90 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  ize;.  pPager->c
20ca0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
20cb0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
20cc0 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65  e;..  if( !pSave
20cd0 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73  point && pagerUs
20ce0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
20cf0 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
20d00 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67  RollbackWal(pPag
20d10 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  er);.  }..  /* U
20d20 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  se pPager->journ
20d30 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66  alOff as the eff
20d40 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
20d50 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
20d60 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
20d70 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  The actual file 
20d80 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
20d90 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a  than this in.  *
20da0 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
20db0 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20  ODE_TRUNCATE or 
20dc0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20dd0 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20  E_PERSIST.  But 
20de0 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61  anything.  ** pa
20df0 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  st pPager->journ
20e00 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d  alOff is off-lim
20e10 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a  its to us..  */.
20e20 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
20e30 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73  journalOff;.  as
20e40 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
20e50 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
20e60 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  szJ==0 );..  /* 
20e70 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67  Begin by rolling
20e80 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72   back records fr
20e90 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
20ea0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
20eb0 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
20ec0 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
20ed0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
20ee0 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
20ef0 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72  eader..  ** Ther
20f00 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72  e might be recor
20f10 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ds in the main j
20f20 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65  ournal that have
20f30 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20   a page number. 
20f40 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e   ** greater than
20f50 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
20f60 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67  abase size (pPag
20f70 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20  er->dbSize) but 
20f80 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  those.  ** will 
20f90 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d  be skipped autom
20fa0 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73  atically.  Pages
20fb0 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44   are added to pD
20fc0 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a  one as they.  **
20fd0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
20fe0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
20ff0 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65  vepoint && !page
21000 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
21010 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d  ){.    iHdrOff =
21020 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
21030 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70  rOffset ? pSavep
21040 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
21050 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67   : szJ;.    pPag
21060 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
21070 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66   pSavepoint->iOf
21080 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  fset;.    while(
21090 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
210a0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
210b0 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a  lOff<iHdrOff ){.
210c0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
210d0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
210e0 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
210f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
21100 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
21110 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
21120 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
21130 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
21140 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21150 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ff = 0;.  }..  /
21160 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69  * Continue rolli
21170 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
21180 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
21190 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
211a0 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   at.  ** the fir
211b0 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
211c0 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69  r seen and conti
211d0 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20  nuing until the 
211e0 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20  effective end.  
211f0 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** of the main j
21200 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f  ournal file.  Co
21210 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f  ntinue to skip o
21220 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
21230 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69  s and.  ** conti
21240 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73  nue adding pages
21250 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
21260 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68  pDone..  */.  wh
21270 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
21280 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
21290 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a  urnalOff<szJ ){.
212a0 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
212b0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
212c0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33  ounter */.    u3
212d0 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
212e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
212f0 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
21300 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
21310 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
21320 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
21330 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  0, szJ, &nJRec, 
21340 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73  &dummy);.    ass
21350 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21360 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  DONE );..    /*.
21370 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67      ** The "pPag
21380 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
21390 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
213a0 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
213b0 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a  ournalOff".    *
213c0 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65  * test is relate
213d0 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36  d to ticket #256
213e0 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63  5.  See the disc
213f0 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ussion in the.  
21400 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
21410 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ack() function f
21420 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
21430 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
21440 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  /.    if( nJRec=
21450 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  =0 .     && pPag
21460 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
21470 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
21480 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
21490 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b  ournalOff.    ){
214a0 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
214b0 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  u32)((szJ - pPag
214c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f  er->journalOff)/
214d0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
214e0 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
214f0 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d    for(ii=0; rc==
21500 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
21510 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d  nJRec && pPager-
21520 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b  >journalOff<szJ;
21530 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63   ii++){.      rc
21540 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
21550 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
21560 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
21570 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
21580 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
21590 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
215a0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20  TE_DONE );.  }. 
215b0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
215c0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
215d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a  ->journalOff>=sz
215e0 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  J );..  /* Final
215f0 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61  ly,  rollback pa
21600 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ges from the sub
21610 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20  -journal.  Page 
21620 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70  that were.  ** p
21630 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64  reviously rolled
21640 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65   back out of the
21650 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61   main journal (a
21660 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20  nd are hence in 
21670 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c  pDone).  ** will
21680 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75   be skipped.  Ou
21690 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
216a0 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65   are also skippe
216b0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  d..  */.  if( pS
216c0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
216d0 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
216e0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
216f0 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66  er */.    i64 of
21700 66 73 65 74 20 3d 20 28 69 36 34 29 70 53 61 76  fset = (i64)pSav
21710 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a  epoint->iSubRec*
21720 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
21730 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ize);..    if( p
21740 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
21750 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
21760 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70   sqlite3WalSavep
21770 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d  ointUndo(pPager-
21780 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e  >pWal, pSavepoin
21790 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20  t->aWalData);.  
217a0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70    }.    for(ii=p
217b0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
217c0 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ec; rc==SQLITE_O
217d0 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e  K && ii<pPager->
217e0 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a  nSubRec; ii++){.
217f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66        assert( of
21800 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34  fset==(i64)ii*(4
21810 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
21820 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  e) );.      rc =
21830 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
21840 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
21850 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c   &offset, pDone,
21860 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 1);.    }.  
21870 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21880 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
21890 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
218a0 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b  cDestroy(pDone);
218b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
218c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
218d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
218e0 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   szJ;.  }..  ret
218f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21900 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
21910 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
21920 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
21930 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
21940 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
21950 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
21960 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
21970 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73  int mxPage){.  s
21980 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43  qlite3PcacheSetC
21990 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
219a0 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
219b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  );.}../*.** Invo
219c0 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ke SQLITE_FCNTL_
219d0 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20  MMAP_SIZE based 
219e0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  on the current v
219f0 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a  alue of szMmap..
21a00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
21a10 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28  agerFixMaplimit(
21a20 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21a30 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
21a40 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c  MAP_SIZE>0.  sql
21a50 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
21a60 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66  pPager->fd;.  if
21a70 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20  ( isOpen(fd) && 
21a80 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56  fd->pMethods->iV
21a90 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20  ersion>=3 ){.   
21aa0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
21ab0 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67  z;.    sz = pPag
21ac0 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20  er->szMmap;.    
21ad0 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63  pPager->bUseFetc
21ae0 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20  h = (sz>0);.    
21af0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
21b00 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
21b10 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
21b20 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a  L_MMAP_SIZE, &sz
21b30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
21b40 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
21b50 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
21b60 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70  f any memory map
21b70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65  ping made of the
21b80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
21b90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
21ba0 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
21bb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
21bc0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
21bd0 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d  Mmap){.  pPager-
21be0 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  >szMmap = szMmap
21bf0 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c  ;.  pagerFixMapl
21c00 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a  imit(pPager);.}.
21c10 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d  ./*.** Free as m
21c20 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
21c30 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ssible from the 
21c40 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  pager..*/.void s
21c50 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
21c60 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
21c70 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
21c80 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e  eShrink(pPager->
21c90 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
21ca0 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e  ** Adjust settin
21cb0 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  gs of the pager 
21cc0 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  to those specifi
21cd0 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67  ed in the pgFlag
21ce0 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  s parameter..**.
21cf0 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69  ** The "level" i
21d00 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  n pgFlags & PAGE
21d10 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41  R_SYNCHRONOUS_MA
21d20 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62 75  SK sets the robu
21d30 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65  stness.** of the
21d40 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
21d50 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
21d60 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66  ashes or power f
21d70 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68  ailures by.** ch
21d80 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
21d90 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
21da0 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  en writing the j
21db0 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72  ournals..** Ther
21dc0 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
21dd0 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
21de0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
21df0 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
21e00 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
21e10 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
21e20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
21e30 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
21e40 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
21e50 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
21e60 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
21e70 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
21e80 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
21e90 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
21ea0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
21eb0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
21ec0 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
21ed0 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
21ef0 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
21f00 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
21f10 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
21f20 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
21f30 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
21f40 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
21f50 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
21f60 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
21f70 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
21f80 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
21f90 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
21fa0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
21fb0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
21fc0 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
21fd0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
21fe0 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
21ff0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
22000 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
22010 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
22020 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22030 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
22040 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
22050 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
22060 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
22080 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
22090 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
220a0 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
220b0 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
220c0 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
220d0 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
220e0 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
220f0 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
22100 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
22110 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
22120 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
22130 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22140 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
22150 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
22160 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
22170 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
22180 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
22190 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
221a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
221b0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
221c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  ..**.** The abov
221d0 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62  e is for a rollb
221e0 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ack-journal mode
221f0 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c  .  For WAL mode,
22200 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a   OFF continues.*
22210 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e  * to mean that n
22220 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63  o syncs ever occ
22230 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e  ur.  NORMAL mean
22240 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69  s that the WAL i
22250 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f  s synced.** prio
22260 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
22270 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64  f checkpoint and
22280 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
22290 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  se file is synce
222a0 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  d.** at the conc
222b0 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68  lusion of the ch
222c0 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
222d0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
222e0 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73  f the WAL.** was
222f0 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
22300 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
22310 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70    But no sync op
22320 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66  erations occur f
22330 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  or.** an ordinar
22340 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d  y commit in NORM
22350 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c  AL mode with WAL
22360 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68  .  FULL means th
22370 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69  at the WAL.** fi
22380 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c  le is synced fol
22390 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d  lowing each comm
223a0 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e  it operation, in
223b0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
223c0 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69  .** syncs associ
223d0 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c  ated with NORMAL
223e0 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63  ..**.** Do not c
223f0 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f  onfuse synchrono
22400 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c  us=FULL with SQL
22410 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20  ITE_SYNC_FULL.  
22420 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59  The.** SQLITE_SY
22430 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65  NC_FULL macro me
22440 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d  ans to use the M
22450 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c  acOSX-style full
22460 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20  -fsync.** using 
22470 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e  fcntl(F_FULLFSYN
22480 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43  C).  SQLITE_SYNC
22490 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f  _NORMAL means to
224a0 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61   do an.** ordina
224b0 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e  ry fsync() call.
224c0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
224d0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
224e0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
224f0 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f  L.** and SQLITE_
22500 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70  SYNC_NORMAL on p
22510 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74  latforms other t
22520 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74  han MacOSX.  But
22530 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e   the.** synchron
22540 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20  ous=FULL versus 
22550 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
22560 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72  AL setting deter
22570 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68  mines when.** th
22580 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76  e xSync primitiv
22590 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20  e is called and 
225a0 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61  is relevant to a
225b0 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a  ll platforms..**
225c0 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
225d0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
225e0 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
225f0 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
22600 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
22610 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
22620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
22630 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
22640 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
22650 61 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ags(.  Pager *pP
22660 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
22670 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74  The pager to set
22680 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f   safety level fo
22690 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
226a0 70 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20  pgFlags      /* 
226b0 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f  Various flags */
226c0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  .){.  unsigned l
226d0 65 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26  evel = pgFlags &
226e0 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f   PAGER_SYNCHRONO
226f0 55 53 5f 4d 41 53 4b 3b 0a 20 20 61 73 73 65 72  US_MASK;.  asser
22700 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c  t( level>=1 && l
22710 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61  evel<=3 );.  pPa
22720 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28  ger->noSync =  (
22730 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
22740 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
22750 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  :0;.  pPager->fu
22760 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d  llSync = (level=
22770 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
22780 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
22790 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
227a0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
227b0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30  r->syncFlags = 0
227c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
227d0 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b  ptSyncFlags = 0;
227e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46  .  }else if( pgF
227f0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c  lags & PAGER_FUL
22800 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50  LFSYNC ){.    pP
22810 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
22820 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
22830 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  LL;.    pPager->
22840 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
22850 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22860 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67  ;.  }else if( pg
22870 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b  Flags & PAGER_CK
22880 50 54 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a  PT_FULLFSYNC ){.
22890 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
228a0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
228b0 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
228c0 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
228d0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
228e0 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73  YNC_FULL;.  }els
228f0 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  e{.    pPager->s
22900 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
22910 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
22920 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
22930 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
22940 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
22950 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c   }.  pPager->wal
22960 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67  SyncFlags = pPag
22970 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20  er->syncFlags;. 
22980 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
22990 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
229a0 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
229b0 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52  s |= WAL_SYNC_TR
229c0 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a  ANSACTIONS;.  }.
229d0 20 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20    if( pgFlags & 
229e0 50 41 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c  PAGER_CACHESPILL
229f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22a00 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53  doNotSpill &= ~S
22a10 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
22a20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
22a30 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d  r->doNotSpill |=
22a40 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a   SPILLFLAG_OFF;.
22a50 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
22a60 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
22a70 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
22a80 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
22a90 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
22aa0 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
22ab0 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
22ac0 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
22ad0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
22ae0 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
22af0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
22b00 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
22b10 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
22b20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
22b30 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
22b40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
22b50 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
22b60 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  ile..**.** Write
22b70 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
22b80 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65  ptor into *pFile
22b90 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
22ba0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a  OK on success .*
22bb0 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
22bc0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
22bd0 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
22be0 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
22bf0 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
22c00 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
22c10 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
22c20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
22c30 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
22c40 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28  VFS layer xOpen(
22c50 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65  ) call are those
22c60 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
22c70 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c   parameter vfsFl
22c80 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68  ags ORed with th
22c90 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
22ca0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
22cb0 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20  EN_READWRITE.** 
22cc0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22cd0 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51  CREATE.**     SQ
22ce0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
22cf0 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  IVE.**     SQLIT
22d00 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
22d10 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LOSE.*/.static i
22d20 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70  nt pagerOpentemp
22d30 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
22d40 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
22d50 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   pager object */
22d60 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
22d70 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74  *pFile,  /* Writ
22d80 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
22d90 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20  iptor here */.  
22da0 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
22db0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
22dc0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
22dd0 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20   the VFS */.){. 
22de0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
22df0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
22e00 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66   code */..#ifdef
22e10 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
22e20 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
22e30 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65  count++;  /* Use
22e40 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
22e50 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20  d analysis only 
22e60 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73  */.#endif..  vfs
22e70 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45  Flags |=  SQLITE
22e80 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
22e90 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
22ea0 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
22eb0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
22ec0 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54  XCLUSIVE | SQLIT
22ed0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
22ee0 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c  LOSE;.  rc = sql
22ef0 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65  ite3OsOpen(pPage
22f00 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c  r->pVfs, 0, pFil
22f10 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b  e, vfsFlags, 0);
22f20 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
22f30 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
22f40 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72  en(pFile) );.  r
22f50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22f60 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
22f70 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
22f80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
22f90 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75  r invokes the bu
22fa0 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71  sy-handler if sq
22fb0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65  lite3OsLock() re
22fc0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
22fd0 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e  _BUSY when tryin
22fe0 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
22ff0 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53  m no-lock to a S
23000 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f  HARED lock,.** o
23010 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  r when trying to
23020 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
23030 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
23040 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a   an EXCLUSIVE .*
23050 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20  * lock. It does 
23060 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65  *not* invoke the
23070 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68   busy handler wh
23080 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
23090 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52  m.** SHARED to R
230a0 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e  ESERVED, or when
230b0 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20   upgrading from 
230c0 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53  SHARED to EXCLUS
230d0 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63  IVE.** (which oc
230e0 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d  curs during hot-
230f0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
23100 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a  ). Summary:.**.*
23110 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20  *   Transition  
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23130 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20        | Invokes 
23140 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20  xBusyHandler.** 
23150 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
23160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
23190 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e  NO_LOCK       ->
231a0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20   SHARED_LOCK    
231b0 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41    | Yes.**   SHA
231c0 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45  RED_LOCK   -> RE
231d0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c  SERVED_LOCK    |
231e0 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f   No.**   SHARED_
231f0 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53  LOCK   -> EXCLUS
23200 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a  IVE_LOCK   | No.
23210 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f  **   RESERVED_LO
23220 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f  CK -> EXCLUSIVE_
23230 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a  LOCK   | Yes.**.
23240 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68  ** If the busy-h
23250 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
23260 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
23270 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  , the lock is .*
23280 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74  * retried. If it
23290 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74   returns zero, t
232a0 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42  hen the SQLITE_B
232b0 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20  USY error is.** 
232c0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
232d0 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61  caller of the pa
232e0 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
232f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23300 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
23310 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70  dler(.  Pager *p
23320 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23340 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
23350 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
23360 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20  dler)(void *),  
23370 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
23380 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65  r to busy-handle
23390 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  r function */.  
233a0 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
233b0 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20  erArg           
233c0 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
233d0 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73   to pass to xBus
233e0 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20  yHandler */.){. 
233f0 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
23400 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e  ndler = xBusyHan
23410 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dler;.  pPager->
23420 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
23430 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  = pBusyHandlerAr
23440 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  g;..  if( isOpen
23450 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
23460 20 20 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20      void **ap = 
23470 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72  (void **)&pPager
23480 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  ->xBusyHandler;.
23490 20 20 20 20 61 73 73 65 72 74 28 20 28 28 69 6e      assert( ((in
234a0 74 28 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70  t(*)(void *))(ap
234b0 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64  [0]))==xBusyHand
234c0 6c 65 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ler );.    asser
234d0 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48  t( ap[1]==pBusyH
234e0 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20  andlerArg );.   
234f0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
23500 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
23510 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
23520 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20  TL_BUSYHANDLER, 
23530 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d  (void *)ap);.  }
23540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
23550 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75   the page size u
23560 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72  sed by the Pager
23570 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77   object. The new
23580 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69   page size .** i
23590 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61  s passed in *pPa
235a0 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
235b0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
235c0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
235d0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
235e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
235f0 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  t.** is a no-op.
23600 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
23610 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72  ned is the error
23620 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
23630 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20  e (i.e. .** one 
23640 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  of SQLITE_IOERR,
23650 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
23660 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72  _xxx sub-code or
23670 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a   SQLITE_FULL)..*
23680 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
23690 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
236a0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
236b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  :.**.**   * the 
236c0 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76  new page size (v
236d0 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69  alue of *pPageSi
236e0 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20  ze) is valid (a 
236f0 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66  power .**     of
23700 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32   two between 512
23710 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f   and SQLITE_MAX_
23720 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75  PAGE_SIZE, inclu
23730 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  sive), and.**.**
23740 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e     * there are n
23750 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
23760 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61  ge references, a
23770 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
23780 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74   database is eit
23790 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  her not an in-me
237a0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72  mory database or
237b0 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e   it is.**     an
237c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
237d0 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  ase that current
237e0 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a  ly consists of z
237f0 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  ero pages..**.**
23800 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
23810 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65  object page size
23820 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67   is set to *pPag
23830 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
23840 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
23850 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74   changed, then t
23860 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  his function use
23870 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  s sqlite3PagerMa
23880 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62  lloc() .** to ob
23890 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72  tain a new Pager
238a0 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
238b0 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63  r. If this alloc
238c0 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a  ation attempt .*
238d0 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
238e0 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
238f0 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73  d and the page s
23900 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68  ize remains unch
23910 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c  anged. .** In al
23920 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53  l other cases, S
23930 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
23940 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
23950 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
23960 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74  not changed, eit
23970 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  her because one 
23980 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65  of the enumerate
23990 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20  d.** conditions 
239a0 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75  above is not tru
239b0 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73  e, the pager was
239c0 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   in error state 
239d0 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e  when this.** fun
239e0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
239f0 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  , or because the
23a00 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
23a10 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65  on attempt faile
23a20 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61  d, .** then *pPa
23a30 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  geSize is set to
23a40 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e   the old, retain
23a50 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66  ed page size bef
23a60 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
23a70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
23a80 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
23a90 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32  ger *pPager, u32
23aa0 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74   *pPageSize, int
23ab0 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e   nReserve){.  in
23ac0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23ad0 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f  ;..  /* It is no
23ae0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f  t possible to do
23af0 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70   a full assert_p
23b00 61 67 65 72 5f 73 74 61 74 65 28 29 20 68 65 72  ager_state() her
23b10 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20  e, as this.  ** 
23b20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
23b30 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
23b40 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20  in PagerOpen(), 
23b50 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74 65  before the state
23b60 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67  .  ** of the Pag
23b70 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74  er object is int
23b80 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65  ernally consiste
23b90 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74  nt..  **.  ** At
23ba0 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20   one point this 
23bb0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65  function returne
23bc0 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  d an error if th
23bd0 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a  e pager was in .
23be0 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52    ** PAGER_ERROR
23bf0 20 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63   state. But sinc
23c00 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  e PAGER_ERROR st
23c10 61 74 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ate guarantees t
23c20 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69  hat.  ** there i
23c30 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  s at least one o
23c40 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
23c50 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20  reference, this 
23c60 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
23c70 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61   a no-op for tha
23c80 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20  t case anyhow.. 
23c90 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53   */..  u32 pageS
23ca0 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65  ize = *pPageSize
23cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
23cc0 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
23cd0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
23ce0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
23cf0 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
23d00 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d    if( (pPager->m
23d10 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65  emDb==0 || pPage
23d20 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20  r->dbSize==0).  
23d30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68   && sqlite3Pcach
23d40 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
23d50 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20  ->pPCache)==0 . 
23d60 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26    && pageSize &&
23d70 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29   pageSize!=(u32)
23d80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23d90 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20   .  ){.    char 
23da0 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20  *pNew = NULL;   
23db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
23dc0 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20   temp space */. 
23dd0 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30     i64 nByte = 0
23de0 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ;..    if( pPage
23df0 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
23e00 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70  OPEN && isOpen(p
23e10 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
23e20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23e30 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
23e40 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a  r->fd, &nByte);.
23e50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
23e60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23e70 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61       pNew = (cha
23e80 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d  r *)sqlite3PageM
23e90 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b  alloc(pageSize);
23ea0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
23eb0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
23ec0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OMEM;.    }..   
23ed0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23ee0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  OK ){.      page
23ef0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
23f00 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23f10 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65  te3PcacheSetPage
23f20 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  Size(pPager->pPC
23f30 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b  ache, pageSize);
23f40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
23f50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23f60 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
23f70 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
23f80 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
23f90 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
23fa0 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
23fb0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
23fc0 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70   (Pgno)((nByte+p
23fd0 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53  ageSize-1)/pageS
23fe0 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
23ff0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
24000 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  ageSize;.    }el
24010 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
24020 33 50 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b  3PageFree(pNew);
24030 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
24040 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
24050 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69  r->pageSize;.  i
24060 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24070 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73   ){.    if( nRes
24080 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
24090 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
240a0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
240b0 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
240c0 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
240d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
240e0 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
240f0 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
24100 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
24110 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69  er);.    pagerFi
24120 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72  xMaplimit(pPager
24130 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24140 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
24150 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24160 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
24170 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
24180 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
24190 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
241a0 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
241b0 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
241c0 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
241d0 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
241e0 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
241f0 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
24200 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
24210 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
24220 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
24230 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
24240 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
24250 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
24260 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
24270 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
24280 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
24290 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
242a0 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
242b0 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
242c0 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
242d0 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
242e0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
242f0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
24300 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
24310 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
24320 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
24330 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
24340 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
24350 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
24360 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
24370 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
24380 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
24390 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
243a0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
243b0 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
243c0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
243d0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
243e0 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
243f0 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
24400 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
24410 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
24420 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
24430 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
24440 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
24450 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
24460 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
24470 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
24480 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
24490 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
244a0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20  =PAGER_OPEN );  
244b0 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e      /* Called on
244c0 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e  ly by OP_MaxPgcn
244d0 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  t */.  assert( p
244e0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70  Pager->mxPgno>=p
244f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
24500 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74    /* OP_MaxPgcnt
24510 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a   enforces this *
24520 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  /.  return pPage
24530 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  r->mxPgno;.}../*
24540 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
24550 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
24560 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
24570 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
24580 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
24590 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
245a0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
245b0 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
245c0 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
245d0 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
245e0 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
245f0 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
24600 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
24610 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
24620 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
24630 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
24640 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
24650 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
24660 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
24670 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
24680 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
24690 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
246a0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
246b0 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
246c0 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
246d0 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
246e0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
246f0 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
24700 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
24710 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
24720 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
24730 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
24740 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
24750 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
24760 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
24770 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
24780 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
24790 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
247a0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
247b0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
247c0 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
247d0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
247e0 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
247f0 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
24800 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
24810 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
24820 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
24830 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
24840 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
24850 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
24860 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
24870 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
24880 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29   (zFilename=="")
24890 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f  , or.** opened o
248a0 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68  n a file less th
248b0 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69  an N bytes in si
248c0 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62  ze, the output b
248d0 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f  uffer is.** zero
248e0 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
248f0 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72   returned. The r
24900 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69  ationale for thi
24910 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a  s is that this .
24920 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  ** function is u
24930 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61  sed to read data
24940 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e  base headers, an
24950 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e  d a new transien
24960 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a  t or.** zero siz
24970 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20  ed database has 
24980 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f  a header than co
24990 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
249a0 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a  of zeroes..**.**
249b0 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72   If any IO error
249c0 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49   apart from SQLI
249d0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
249e0 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  EAD is encounter
249f0 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ed,.** the error
24a00 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
24a10 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
24a20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
24a30 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75   of the.** outpu
24a40 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e  t buffer undefin
24a50 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
24a60 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
24a70 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
24a80 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
24a90 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
24aa0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
24ab0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
24ac0 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
24ad0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
24ae0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
24af0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
24b00 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   );..  /* This r
24b10 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
24b20 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69  alled by btree i
24b30 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
24b40 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74   creating.  ** t
24b50 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
24b60 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20    There has not 
24b70 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e  been an opportun
24b80 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f  ity to transitio
24b90 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f  n.  ** to WAL mo
24ba0 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  de yet..  */.  a
24bb0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
24bc0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
24bd0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
24be0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
24bf0 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
24c00 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
24c10 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
24c20 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
24c30 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
24c40 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
24c50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
24c60 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
24c70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24c80 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
24c90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24ca0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24cb0 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ion may only be 
24cc0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65  called when a re
24cd0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
24ce0 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  s open on.** the
24cf0 20 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72   pager. It retur
24d00 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ns the total num
24d10 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
24d20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
24d30 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20  .** However, if 
24d40 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77  the file is betw
24d50 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d  een 1 and <page-
24d60 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73  size> bytes in s
24d70 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  ize, then .** th
24d80 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  is is considered
24d90 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a   a 1 page file..
24da0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
24db0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
24dc0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
24dd0 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73   *pnPage){.  ass
24de0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
24df0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
24e00 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
24e10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
24e20 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
24e30 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67  SHED );.  *pnPag
24e40 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d  e = (int)pPager-
24e50 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  >dbSize;.}.../*.
24e60 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
24e70 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
24e80 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20  locktype on the 
24e90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
24ea0 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f  f.** a similar o
24eb0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69  r greater lock i
24ec0 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
24ed0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
24ee0 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74   a no-op.** (ret
24ef0 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
24f00 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a   immediately)..*
24f10 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
24f20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
24f30 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  n the lock using
24f40 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
24f50 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65  . Invoke .** the
24f60 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
24f70 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75  f the lock is cu
24f80 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
24f90 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a  lable. Repeat .*
24fa0 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  * until the busy
24fb0 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
24fc0 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  s false or until
24fd0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
24fe0 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c  .** obtain the l
24ff0 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
25000 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
25010 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
25020 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
25030 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
25040 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
25050 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69  k. If the lock i
25060 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65  s obtained succe
25070 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65  ssfully, set the
25080 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a   Pager.state .**
25090 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63   variable to loc
250a0 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74  ktype before ret
250b0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
250c0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
250d0 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
250e0 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
250f0 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
25100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25120 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
25130 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
25140 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
25150 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65  a no-op (because
25160 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
25170 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72  ock is .  ** alr
25180 65 61 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f  eady held), or o
25190 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  ne of the transi
251a0 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62  tions that the b
251b0 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a  usy-handler.  **
251c0 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20   may be invoked 
251d0 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e  during, accordin
251e0 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  g to the comment
251f0 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69   above.  ** sqli
25200 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
25210 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  andler()..  */. 
25220 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
25230 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70  ->eLock>=locktyp
25240 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  e).       || (pP
25250 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ager->eLock==NO_
25260 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
25270 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
25280 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
25290 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
252a0 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  D_LOCK && lockty
252b0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
252c0 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b  CK).  );..  do {
252d0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c  .    rc = pagerL
252e0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f  ockDb(pPager, lo
252f0 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  cktype);.  }whil
25300 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
25310 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42  SY && pPager->xB
25320 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
25330 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
25340 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  rg) );.  return 
25350 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e  rc;.}../*.** Fun
25360 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e  ction assertTrun
25370 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
25380 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68  Pager) checks th
25390 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a  at one of the .*
253a0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  * following is t
253b0 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74  rue for all dirt
253c0 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  y pages currentl
253d0 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  y in the page-ca
253e0 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  che:.**.**   a) 
253f0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
25400 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
25410 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a  equal to the siz
25420 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20  e of the .**    
25430 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61    current databa
25440 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67  se image, in pag
25450 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62  es, OR.**.**   b
25460 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f  ) if the page co
25470 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74  ntent were writt
25480 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c  en at this time,
25490 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a   it would not.**
254a0 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61        be necessa
254b0 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
254c0 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20  current content 
254d0 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  out to the sub-j
254e0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28  ournal.**      (
254f0 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
25500 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65   function subjRe
25510 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a  quiresPage())..*
25520 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64  *.** If the cond
25530 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62  ition asserted b
25540 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
25550 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61  were not true, a
25560 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  nd the.** dirty 
25570 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20  page were to be 
25580 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74  discarded from t
25590 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65  he cache via the
255a0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a   pagerStress().*
255b0 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72  * routine, pager
255c0 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e  Stress() would n
255d0 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72  ot write the cur
255e0 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
255f0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61  t to.** the data
25600 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20  base file. If a 
25610 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61  savepoint transa
25620 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65  ction were rolle
25630 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20  d back after.** 
25640 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74  this happened, t
25650 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
25660 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ior would be to 
25670 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  restore the curr
25680 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  ent.** content o
25690 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65  f the page. Howe
256a0 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20  ver, since this 
256b0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70  content is not p
256c0 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72  resent in either
256d0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
256e0 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72   file or the por
256f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c  tion of the roll
25700 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
25710 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   .** sub-journal
25720 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
25730 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e   content could n
25740 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  ot be restored a
25750 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  nd the.** databa
25760 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62  se image would b
25770 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49  ecome corrupt. I
25780 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66  t is therefore f
25790 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a  ortunate that .*
257a0 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61  * this circumsta
257b0 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65  nce cannot arise
257c0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
257d0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73  (SQLITE_DEBUG).s
257e0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
257f0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
25800 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67  intCb(PgHdr *pPg
25810 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
25820 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
25830 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RTY );.  assert(
25840 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
25850 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  ge(pPg) || pPg->
25860 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65  pgno<=pPg->pPage
25870 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73  r->dbSize );.}.s
25880 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
25890 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
258a0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
258b0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
258c0 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
258d0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
258e0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
258f0 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a  onstraintCb);.}.
25900 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61  #else.# define a
25910 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25920 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a  straint(pPager).
25930 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
25940 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  uncate the in-me
25950 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mory database fi
25960 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67  le image to nPag
25970 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a  e pages. This .*
25980 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  * function does 
25990 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
259a0 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
259b0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49   file on disk. I
259c0 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20  t .** just sets 
259d0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
259e0 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
259f0 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74  object so that t
25a00 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f  he .** truncatio
25a10 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77  n will be done w
25a20 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
25a30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
25a40 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
25a50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
25a60 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67   only called rig
25a70 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  ht before commit
25a80 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
25a90 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  on..** Once this
25aa0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
25ab0 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74  en called, the t
25ac0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
25ad0 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c  either be.** rol
25ae0 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d  led back or comm
25af0 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74  itted. It is not
25b00 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68   safe to call th
25b10 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a  is function and.
25b20 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65  ** then continue
25b30 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
25b40 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69  database..*/.voi
25b50 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  d sqlite3PagerTr
25b60 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65  uncateImage(Page
25b70 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
25b80 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
25b90 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
25ba0 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73  >=nPage );.  ass
25bb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
25bc0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
25bd0 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
25be0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
25bf0 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74   nPage;..  /* At
25c00 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63   one point the c
25c10 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20  ode here called 
25c20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25c30 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20  nstraint() to.  
25c40 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  ** ensure that a
25c50 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20 74  ll pages being t
25c60 72 75 6e 63 61 74 65 64 20 61 77 61 79 20 62 79  runcated away by
25c70 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
25c80 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65  are,.  ** if one
25c90 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69   or more savepoi
25ca0 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72  nts are open, pr
25cb0 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76  esent in the sav
25cc0 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75  epoint .  ** jou
25cd0 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65  rnal so that the
25ce0 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  y can be restore
25cf0 64 20 69 66 20 74 68 65 20 73 61 76 65 70 6f 69  d if the savepoi
25d00 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a  nt is rolled.  *
25d10 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  * back. This is 
25d20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73  no longer necess
25d30 61 72 79 20 61 73 20 74 68 69 73 20 66 75 6e 63  ary as this func
25d40 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79  tion is now only
25d50 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67  .  ** called rig
25d60 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  ht before commit
25d70 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
25d80 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20  on. So although 
25d90 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20  the .  ** Pager 
25da0 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c  object may still
25db0 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70   have open savep
25dc0 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61  oints (Pager.nSa
25dd0 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20  vepoint!=0), .  
25de0 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62  ** they cannot b
25df0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53  e rolled back. S
25e00 6f 20 74 68 65 20 61 73 73 65 72 74 54 72 75 6e  o the assertTrun
25e10 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29  cateConstraint()
25e20 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f   call.  ** is no
25e30 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e   longer correct.
25e40 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.}.../*.** Th
25e50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
25e60 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74  alled before att
25e70 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  empting a hot-jo
25e80 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
25e90 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20  It.** syncs the 
25ea0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
25eb0 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20  disk, then sets 
25ec0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
25ed0 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a  dr to the.** siz
25ee0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
25ef0 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68   file so that th
25f00 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
25f10 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73  () routine knows
25f20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74  .** that the ent
25f30 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ire journal file
25f40 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
25f50 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20  ..**.** Syncing 
25f60 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f  a hot-journal to
25f70 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74   disk before att
25f80 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
25f90 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20  it back ensures 
25fa0 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f  .** that if a po
25fb0 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75  wer-failure occu
25fc0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
25fd0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63  llback, the proc
25fe0 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65  ess that.** atte
25ff0 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  mpts rollback fo
26000 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72  llowing system r
26010 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65  ecovery sees the
26020 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   same journal.**
26030 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73   content as this
26040 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
26050 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  If everything go
26060 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53  es as planned, S
26070 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
26080 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
26090 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65   .** an SQLite e
260a0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
260b0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79  atic int pagerSy
260c0 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  ncHotJournal(Pag
260d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
260e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
260f0 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
26100 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
26110 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
26120 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
26130 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
26140 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  AL);.  }.  if( r
26150 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26160 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26170 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
26180 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
26190 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
261a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
261b0 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  ../*.** Obtain a
261c0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
261d0 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61  memory mapped pa
261e0 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61  ge object for pa
261f0 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20  ge number pgno. 
26200 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65  .** The new obje
26210 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20  ct will use the 
26220 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f  pointer pData, o
26230 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65  btained from xFe
26240 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63  tch()..** If suc
26250 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70  cessful, set *pp
26260 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Page to point to
26270 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 72 65   the new page re
26280 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72  ference.** and r
26290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
262a0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
262b0 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
262c0 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a  or code and set.
262d0 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65  ** *ppPage to ze
262e0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72  ro..**.** Page r
262f0 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e  eferences obtain
26300 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ed by calling th
26310 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
26320 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a  ld be released.*
26330 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67  * by calling pag
26340 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
26350 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
26360 74 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61  t pagerAcquireMa
26370 70 50 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  pPage(.  Pager *
26380 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
26390 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
263a0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
263b0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
263c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
263d0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   Page number */.
263e0 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20    void *pData,  
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26400 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20    /* xFetch()'d 
26410 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 70 61  data for this pa
26420 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a  ge */.  PgHdr **
26430 70 70 50 61 67 65 20 20 20 20 20 20 20 20 20 20  ppPage          
26440 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
26450 41 63 71 75 69 72 65 64 20 70 61 67 65 20 6f 62  Acquired page ob
26460 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48  ject */.){.  PgH
26470 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
26480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26490 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61  Memory mapped pa
264a0 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ge to return */.
264b0 20 20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d    .  if( pPager-
264c0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29  >pMmapFreelist )
264d0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
264e0 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  p = pPager->pMma
264f0 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70  pFreelist;.    p
26500 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26510 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79  list = p->pDirty
26520 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20  ;.    p->pDirty 
26530 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 0;.    memset(
26540 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50  p->pExtra, 0, pP
26550 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
26560 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
26570 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72  age = p = (PgHdr
26580 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
26590 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64  Zero(sizeof(PgHd
265a0 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  r) + pPager->nEx
265b0 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  tra);.    if( p=
265c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
265d0 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
265e0 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
265f0 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d  gno-1) * pPager-
26600 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61  >pageSize, pData
26610 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
26620 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
26630 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72    }.    p->pExtr
26640 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31  a = (void *)&p[1
26650 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  ];.    p->flags 
26660 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20  = PGHDR_MMAP;.  
26670 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
26680 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70     p->pPager = p
26690 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73  Pager;.  }..  as
266a0 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d  sert( p->pExtra=
266b0 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29  =(void *)&p[1] )
266c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
266d0 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Page==0 );.  ass
266e0 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50  ert( p->flags==P
266f0 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61  GHDR_MMAP );.  a
26700 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72  ssert( p->pPager
26710 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73  ==pPager );.  as
26720 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31  sert( p->nRef==1
26730 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d   );..  p->pgno =
26740 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74   pgno;.  p->pDat
26750 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61  a = pData;.  pPa
26760 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b  ger->nMmapOut++;
26770 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
26780 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
26790 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e  elease a referen
267a0 63 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20  ce to page pPg. 
267b0 70 50 67 20 6d 75 73 74 20 68 61 76 65 20 62 65  pPg must have be
267c0 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  en returned by a
267d0 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61  n .** earlier ca
267e0 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75 69  ll to pagerAcqui
267f0 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a  reMapPage()..*/.
26800 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
26810 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
26820 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
26830 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
26840 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50  Pg->pPager;.  pP
26850 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d  ager->nMmapOut--
26860 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20  ;.  pPg->pDirty 
26870 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  = pPager->pMmapF
26880 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65  reelist;.  pPage
26890 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
268a0 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72   = pPg;..  asser
268b0 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  t( pPager->fd->p
268c0 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f  Methods->iVersio
268d0 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65  n>=3 );.  sqlite
268e0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
268f0 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67  r->fd, (i64)(pPg
26900 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72  ->pgno-1)*pPager
26910 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d  ->pageSize, pPg-
26920 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pData);.}../*.*
26930 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72  * Free all PgHdr
26940 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20   objects stored 
26950 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d  in the Pager.pMm
26960 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e  apFreelist list.
26970 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26980 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73  pagerFreeMapHdrs
26990 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
269a0 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50  .  PgHdr *p;.  P
269b0 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66  gHdr *pNext;.  f
269c0 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d  or(p=pPager->pMm
269d0 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70  apFreelist; p; p
269e0 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
269f0 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  xt = p->pDirty;.
26a00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26a10 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  (p);.  }.}.../*.
26a20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
26a30 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
26a40 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
26a50 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
26a60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
26a70 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
26a80 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
26a90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
26aa0 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
26ab0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
26ac0 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
26ad0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
26ae0 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
26af0 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
26b00 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
26b10 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
26b20 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
26b30 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
26b40 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
26b50 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
26b60 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
26b70 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
26b80 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
26b90 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26ba0 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
26bb0 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
26bc0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
26bd0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
26be0 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
26bf0 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
26c00 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
26c10 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
26c20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
26c30 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
26c40 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
26c50 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
26c60 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
26c70 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
26c80 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
26c90 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
26ca0 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38    u8 *pTmp = (u8
26cb0 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   *)pPager->pTmpS
26cc0 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  pace;..  assert(
26cd0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
26ce0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
26cf0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
26d00 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
26d10 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
26d20 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
26d30 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73  pagerFreeMapHdrs
26d40 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70  (pPager);.  /* p
26d50 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
26d60 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
26d70 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
26d80 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
26d90 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71  TE_OMIT_WAL.  sq
26da0 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
26db0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67  ager->pWal, pPag
26dc0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
26dd0 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  s, pPager->pageS
26de0 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50  ize, pTmp);.  pP
26df0 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
26e00 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
26e10 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
26e20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
26e30 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
26e40 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
26e50 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
26e60 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a  open, sync the j
26e70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
26e80 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63  re calling Unloc
26e90 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20  kAndRollback..  
26ea0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
26eb0 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61  not done, then a
26ec0 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  n unsynced porti
26ed0 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  on of the open j
26ee0 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66  ournal .    ** f
26ef0 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65  ile may be playe
26f00 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
26f10 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70  database. If a p
26f20 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
26f30 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c  urs .    ** whil
26f40 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  e this is happen
26f50 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
26f60 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e could become c
26f70 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20  orrupt..    **. 
26f80 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f     ** If an erro
26f90 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
26fa0 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68  rying to sync th
26fb0 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74  e journal, shift
26fc0 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
26fd0 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52  * into the ERROR
26fe0 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75   state. This cau
26ff0 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ses UnlockAndRol
27000 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20  lback to unlock 
27010 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
27020 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ase and close th
27030 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
27040 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e  ithout attemptin
27050 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20  g to roll it.   
27060 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61   ** back or fina
27070 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78  lize it. The nex
27080 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20  t database user 
27090 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20  will have to do 
270a0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot-journal.    
270b0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f  ** rollback befo
270c0 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
270d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
270e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
270f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27100 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  d) ){.      page
27110 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
27120 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
27130 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20  nal(pPager));.  
27140 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c    }.    pagerUnl
27150 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
27160 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
27170 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
27180 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65  lloc();.  enable
27190 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
271a0 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
271b0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
271c0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
271d0 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  er)));.  IOTRACE
271e0 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
271f0 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74  pPager)).  sqlit
27200 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
27210 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  ->jfd);.  sqlite
27220 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
27230 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  >fd);.  sqlite3P
27240 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20  ageFree(pTmp);. 
27250 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
27260 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ose(pPager->pPCa
27270 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  che);..#ifdef SQ
27280 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
27290 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
272a0 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72  decFree ) pPager
272b0 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61  ->xCodecFree(pPa
272c0 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65  ger->pCodec);.#e
272d0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
272e0 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  !pPager->aSavepo
272f0 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  int && !pPager->
27300 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  pInJournal );.  
27310 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
27320 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
27330 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
27340 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69  sjfd) );..  sqli
27350 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
27360 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
27370 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  E_OK;.}..#if !de
27380 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
27390 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
273a0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
273b0 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
273c0 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  er for page pPg.
273d0 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
273e0 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
273f0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
27400 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f  return pPg->pgno
27410 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
27420 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
27430 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
27440 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
27450 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
27460 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
27470 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  g){.  sqlite3Pca
27480 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a  cheRef(pPg);.}..
27490 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
274a0 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72  ournal. In other
274b0 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
274c0 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
274d0 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
274e0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
274f0 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
27500 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
27510 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
27520 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61  e.** disk and ca
27530 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e  n be restored in
27540 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
27550 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
27560 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
27570 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  he Pager.noSync 
27580 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
27590 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
275a0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f  is a no-op..** O
275b0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63  therwise, the ac
275c0 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64  tions required d
275d0 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75  epend on the jou
275e0 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68  rnal-mode and th
275f0 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61  e .** device cha
27600 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20  racteristics of 
27610 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
27620 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
27630 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f  **   * If the jo
27640 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e  urnal file is an
27650 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
27660 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69  al file, no acti
27670 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62  on need.**     b
27680 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20  e taken..**.**  
27690 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66   * Otherwise, if
276a0 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
276b0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
276c0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
276d0 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68  perty,.**     th
276e0 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
276f0 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
27700 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a  cently written j
27710 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
27720 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20       is updated 
27730 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
27740 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  umber of journal
27750 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61   records that ha
27760 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77  ve.**     been w
27770 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67  ritten following
27780 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65   it. If the page
27790 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69  r is operating i
277a0 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20  n full-sync.**  
277b0 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68     mode, then th
277c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
277d0 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20  s synced before 
277e0 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70  this field is up
277f0 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  dated..**.**   *
27800 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64   If the device d
27810 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
27820 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70  the SEQUENTIAL p
27830 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a  roperty, then .*
27840 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69  *     journal fi
27850 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  le is synced..**
27860 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64  .** Or, in pseud
27870 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  o-code:.**.**   
27880 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f  if( NOT <in-memo
27890 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a  ry journal> ){.*
278a0 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41  *     if( NOT SA
278b0 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20  FE_APPEND ){.** 
278c0 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d        if( <full-
278d0 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79  sync mode> ) xSy
278e0 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
278f0 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70  >);.**       <up
27900 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e  date nRec field>
27910 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20  .**     } .**   
27920 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e    if( NOT SEQUEN
27930 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f  TIAL ) xSync(<jo
27940 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
27950 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75     }.**.** If su
27960 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72  ccessful, this r
27970 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
27980 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
27990 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20  C flag of every 
279a0 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74  .** page current
279b0 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  ly held in memor
279c0 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  y before returni
279d0 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ng SQLITE_OK. If
279e0 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
279f0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
27a00 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
27a10 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
27a20 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
27a30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27a40 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
27a50 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
27a60 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63  ewHdr){.  int rc
27a70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
27a90 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
27aa0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
27ab0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
27ac0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
27ad0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
27ae0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
27af0 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
27b00 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
27b10 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
27b20 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
27b30 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
27b40 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  ager) );..  rc =
27b50 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
27b60 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65  lusiveLock(pPage
27b70 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
27b80 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
27b90 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
27ba0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
27bb0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
27bc0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
27bd0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
27be0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
27bf0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
27c00 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
27c10 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
27c20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
27c30 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
27c40 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
27c50 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
27c60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27c70 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27c80 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
27c90 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
27ca0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
27cb0 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
27cc0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
27cd0 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
27ce0 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
27cf0 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
27d00 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
27d10 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
27d20 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
27d30 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
27d40 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
27d50 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
27d60 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
27d70 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
27d80 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
27d90 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
27da0 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
27db0 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
27dc0 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
27dd0 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
27de0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
27df0 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
27e00 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
27e10 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
27e20 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
27e30 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
27e40 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
27e50 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
27e60 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
27e70 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
27e80 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
27e90 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
27ea0 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
27eb0 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
27ec0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
27ed0 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
27ee0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
27ef0 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
27f00 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
27f10 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
27f20 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
27f30 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
27f40 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
27f50 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
27f60 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
27f70 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
27f80 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
27f90 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
27fa0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
27fb0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
27fc0 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
27fd0 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
27fe0 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
27ff0 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
28000 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
28010 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
28020 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
28030 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28040 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
28050 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
28060 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
28070 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
28080 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
28090 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
280a0 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
280b0 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
280c0 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
280d0 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
280e0 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
280f0 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
28100 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
28110 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
28120 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
28130 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
28140 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
28150 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
28160 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
28170 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
28180 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
28190 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
281a0 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
281b0 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
281c0 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
281d0 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
281e0 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
281f0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
28200 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
28210 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
28220 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
28230 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
28240 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
28250 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
28260 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
28270 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
28280 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
28290 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
282a0 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
282b0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
282c0 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
282d0 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
282e0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
282f0 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
28300 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
28310 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
28320 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
28330 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
28340 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28350 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
28360 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
28370 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
28380 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
28390 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
283a0 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
283b0 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
283c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
283d0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
283e0 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
283f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28400 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
28410 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
28420 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
28430 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
28440 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28450 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
28460 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
28470 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
28480 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
28490 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
284a0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
284b0 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
284c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
284d0 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
284e0 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
284f0 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
28500 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
28510 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
28520 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
28530 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
28540 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
28550 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
28560 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
28570 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
28580 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
28590 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
285a0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
285b0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
285c0 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
285d0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
285e0 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
285f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
28600 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
28610 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
28620 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
28630 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
28640 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
28650 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
28660 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
28670 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
28680 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
28690 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
286a0 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
286b0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
286c0 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
286d0 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
286e0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
286f0 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
28700 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
28710 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
28720 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
28730 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
28740 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
28750 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
28760 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
28770 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
28780 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
28790 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
287a0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
287b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
287c0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
287d0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
287e0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
287f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
28800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28810 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
28820 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
28830 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
28840 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
28850 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
28860 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
28870 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
28880 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
28890 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
288a0 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
288b0 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
288c0 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b  alHdr.        );
288d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
288e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
288f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
28900 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
28910 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
28920 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
28930 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
28940 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
28950 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
28960 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
28970 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
28980 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
28990 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
289a0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
289b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
289c0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20  ger->syncFlags| 
289d0 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
289e0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53  er->syncFlags==S
289f0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f  QLITE_SYNC_FULL?
28a00 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
28a10 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20  ONLY:0).        
28a20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28a30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28a40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28a50 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  }..      pPager-
28a60 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
28a70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28a80 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48  ;.      if( newH
28a90 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  dr && 0==(iDc&SQ
28aa0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
28ab0 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
28ac0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
28ad0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
28ae0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
28af0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
28b00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28b10 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
28b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
28b30 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
28b40 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
28b50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28b60 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
28b70 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   /* Unless the p
28b80 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e  ager is in noSyn
28b90 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
28ba0 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
28bb0 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  t .  ** successf
28bc0 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74  ully synced. Eit
28bd0 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74  her way, clear t
28be0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
28bf0 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a  NC flag on .  **
28c00 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f   all pages..  */
28c10 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
28c20 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
28c30 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
28c40 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
28c50 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
28c60 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74  _DBMOD;.  assert
28c70 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
28c80 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
28c90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28ca0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
28cb0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
28cc0 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
28cd0 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
28ce0 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
28cf0 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
28d00 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
28d10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
28d20 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
28d30 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
28d40 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
28d50 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
28d60 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
28d70 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
28d80 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
28d90 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
28da0 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
28db0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
28dc0 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
28dd0 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
28de0 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
28df0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
28e00 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
28e10 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
28e20 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
28e30 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
28e40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
28e50 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
28e60 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
28e70 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
28e80 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
28e90 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
28ea0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
28eb0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
28ec0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
28ed0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
28ee0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
28ef0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
28f00 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
28f10 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
28f20 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
28f30 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
28f40 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
28f50 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
28f60 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
28f70 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
28f80 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
28f90 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
28fa0 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
28fb0 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
28fc0 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
28fd0 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
28fe0 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
28ff0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
29000 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
29010 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
29020 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
29030 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
29040 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
29050 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
29060 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
29070 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
29080 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
29090 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
290a0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
290b0 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
290c0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
290d0 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
290e0 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
290f0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
29100 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
29110 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
29120 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
29130 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
29140 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
29150 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
29160 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
29170 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
29180 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
29190 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
291a0 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
291b0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
291c0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
291d0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
291e0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
291f0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
29200 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
29210 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
29220 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
29230 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
29240 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
29250 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
29260 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
29270 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
29280 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
29290 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65  te_pagelist(Page
292a0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
292b0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
292c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
292d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292e0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
292f0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
29300 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
29310 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61  alled for rollba
29320 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49  ck pagers in WRI
29330 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e  TER_DBMOD state.
29340 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
29350 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
29360 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29370 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
29380 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
29390 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OD );.  assert( 
293a0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
293b0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
293c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
293d0 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  le is a temp-fil
293e0 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
293f0 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
29400 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20  it now. It.  ** 
29410 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
29420 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68  for rc to be oth
29430 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
29440 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68  K if this branch
29450 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20  .  ** is taken, 
29460 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  as pager_wait_on
29470 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  _lock() is a no-
29480 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65  op for temp-file
29490 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
294a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
294b0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
294c0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
294d0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
294e0 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
294f0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
29500 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ger, pPager->fd,
29510 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
29520 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  s);.  }..  /* Be
29530 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
29540 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56  rite, give the V
29550 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61  FS a hint of wha
29560 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a  t the final.  **
29570 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20   file size will 
29580 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  be..  */.  asser
29590 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
295a0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
295b0 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20  r->fd) );.  if( 
295c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
295d0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48    && pPager->dbH
295e0 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  intSize<pPager->
295f0 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c  dbSize.   && (pL
29600 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70  ist->pDirty || p
29610 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  List->pgno>pPage
29620 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20  r->dbHintSize). 
29630 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
29640 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70  int64 szFile = p
29650 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
29660 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  * (sqlite3_int64
29670 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
29680 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
29690 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
296a0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
296b0 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
296c0 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20  , &szFile);.    
296d0 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
296e0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
296f0 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ize;.  }..  whil
29700 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
29710 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
29720 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69   Pgno pgno = pLi
29730 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f  st->pgno;..    /
29740 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
29750 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
29760 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
29770 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
29780 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
29790 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
297a0 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
297b0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
297c0 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c  Image() was call
297d0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
297e0 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
297f0 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
29800 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
29810 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
29820 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
29830 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
29840 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
29850 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20  ** Also, do not 
29860 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61  write out any pa
29870 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ge that has the 
29880 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
29890 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74   flag.    ** set
298a0 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33   (set by sqlite3
298b0 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29  PagerDontWrite()
298c0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
298d0 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
298e0 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c  dbSize && 0==(pL
298f0 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
29900 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a  _DONT_WRITE) ){.
29910 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
29920 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
29930 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
29940 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  e;   /* Offset t
29950 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  o write */.     
29960 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20   char *pData;   
29970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29990 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65  /* Data to write
299a0 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61   */    ..      a
299b0 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66  ssert( (pList->f
299c0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
299d0 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
299e0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
299f0 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69  o==1 ) pager_wri
29a00 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
29a10 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20  (pList);..      
29a20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61  /* Encode the da
29a30 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
29a40 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
29a50 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e  List->pData, pgn
29a60 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 6, return SQL
29a70 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
29a80 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  );..      /* Wri
29a90 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20  te out the page 
29aa0 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72  data. */.      r
29ab0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
29ac0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
29ad0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
29ae0 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
29af0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61  ..      /* If pa
29b00 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72  ge 1 was just wr
29b10 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61  itten, update Pa
29b20 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74  ger.dbFileVers t
29b30 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a  o match.      **
29b40 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73   the value now s
29b50 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
29b60 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77  abase file. If w
29b70 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20  riting this .   
29b80 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65     ** page cause
29b90 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
29ba0 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64  ile to grow, upd
29bb0 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20  ate dbFileSize. 
29bc0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
29bd0 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
29be0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
29bf0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
29c00 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
29c10 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
29c20 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
29c30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67    }.      if( pg
29c40 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
29c50 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
29c60 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
29c70 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
29c80 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
29c90 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
29ca0 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20  AT_WRITE]++;..  
29cb0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e      /* Update an
29cc0 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  y backup objects
29cd0 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e   copying the con
29ce0 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
29cf0 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ger. */.      sq
29d00 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
29d10 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
29d20 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c  p, pgno, (u8*)pL
29d30 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20  ist->pData);..  
29d40 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
29d50 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
29d60 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
29d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29d80 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
29d90 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
29da0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
29db0 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
29dc0 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
29dd0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
29de0 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
29df0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
29e00 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
29e10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
29e20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
29e30 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
29e40 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
29e50 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
29e60 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
29e70 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c  _set_pagehash(pL
29e80 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  ist);.    pList 
29e90 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
29ea0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
29eb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75  c;.}../*.** Ensu
29ec0 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d  re that the sub-
29ed0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
29ee0 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61  open. If it is a
29ef0 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69  lready open, thi
29f00 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
29f10 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
29f20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
29f30 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
29f40 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64  hing goes accord
29f50 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20  ing to plan. An 
29f60 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
29f70 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
29f80 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
29f90 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
29fa0 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69  OsOpen() .** fai
29fb0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
29fc0 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  t openSubJournal
29fd0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
29fe0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29ff0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73  TE_OK;.  if( !is
2a000 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
2a010 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  d) ){.    if( pP
2a020 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2a030 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
2a040 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70  MODE_MEMORY || p
2a050 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
2a060 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ory ){.      sql
2a070 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
2a080 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2a090 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a0a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
2a0b0 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
2a0c0 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49  ager->sjfd, SQLI
2a0d0 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
2a0e0 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  AL);.    }.  }. 
2a0f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2a100 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65  *.** Append a re
2a110 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72  cord of the curr
2a120 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67  ent state of pag
2a130 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62  e pPg to the sub
2a140 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74  -journal. .** It
2a150 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
2a160 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74  responsibility t
2a170 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72  o use subjRequir
2a180 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63  esPage() to chec
2a190 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  k .** that it is
2a1a0 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
2a1b0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
2a1c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
2a1d0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2a1e0 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20  ul, set the bit 
2a1f0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2a200 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68   pPg->pgno in th
2a210 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72  e bitvecs.** for
2a220 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
2a230 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75  ints before retu
2a240 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rning..**.** Thi
2a250 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2a260 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
2a270 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
2a280 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a  ccessful, an IO.
2a290 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
2a2a0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
2a2b0 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62  write to the sub
2a2c0 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  -journal fails, 
2a2d0 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
2a2e0 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
2a2f0 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74  fails while sett
2a300 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73  ing a bit in a s
2a310 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76  avepoint.** bitv
2a320 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ec..*/.static in
2a330 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
2a340 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2a350 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a360 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
2a370 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2a380 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  r;.  if( pPager-
2a390 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2a3a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2a3b0 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f  OFF ){..    /* O
2a3c0 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
2a3d0 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e  nal, if it has n
2a3e0 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
2a3f0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73  opened */.    as
2a400 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2a410 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
2a420 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2a430 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
2a440 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2a450 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r) );.    assert
2a460 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2a470 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  >sjfd) || pPager
2a480 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a  ->nSubRec==0 );.
2a490 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
2a4a0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2a4b0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67  .         || pag
2a4c0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  eInJournal(pPage
2a4d0 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20  r, pPg) .       
2a4e0 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70    || pPg->pgno>p
2a4f0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2a500 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  e .    );.    rc
2a510 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
2a520 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  l(pPager);..    
2a530 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f  /* If the sub-jo
2a540 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64  urnal was opened
2a550 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f   successfully (o
2a560 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70  r was already op
2a570 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74  en),.    ** writ
2a580 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  e the journal re
2a590 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69  cord into the fi
2a5a0 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
2a5b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a5c0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
2a5d0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
2a5e0 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
2a5f0 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d  t = (i64)pPager-
2a600 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >nSubRec*(4+pPag
2a610 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
2a620 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
2a630 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45  2;.  .      CODE
2a640 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
2a650 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
2a660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2a670 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  MEM, pData2);.  
2a680 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2a690 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
2a6a0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
2a6b0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
2a6c0 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  g->pgno));.     
2a6d0 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
2a6e0 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  s(pPager->sjfd, 
2a6f0 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e  offset, pPg->pgn
2a700 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
2a710 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a720 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a730 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
2a740 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c  r->sjfd, pData2,
2a750 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2a760 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20  e, offset+4);.  
2a770 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2a780 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a790 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
2a7a0 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20  r->nSubRec++;.  
2a7b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2a7c0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29  ->nSavepoint>0 )
2a7d0 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f  ;.    rc = addTo
2a7e0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
2a7f0 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
2a800 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
2a810 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2a820 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2a830 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63  called by the pc
2a840 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20  ache layer when 
2a850 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73  it has reached s
2a860 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f  ome.** soft memo
2a870 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69  ry limit. The fi
2a880 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
2a890 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50  a pointer to a P
2a8a0 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28  ager object.** (
2a8b0 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29  cast as a void*)
2a8c0 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61  . The pager is a
2a8d0 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65  lways 'purgeable
2a8e0 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  ' (not an in-mem
2a8f0 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29  ory.** database)
2a900 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
2a910 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72  ument is a refer
2a920 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74  ence to a page t
2a930 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65  hat is .** curre
2a940 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68  ntly dirty but h
2a950 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
2a960 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68  g references. Th
2a970 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77  e page.** is alw
2a980 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ays associated w
2a990 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62  ith the Pager ob
2a9a0 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
2a9b0 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67  he first .** arg
2a9c0 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ument..**.** The
2a9d0 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e   job of this fun
2a9e0 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65  ction is to make
2a9f0 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72   pPg clean by wr
2aa00 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e  iting its conten
2aa10 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65  ts.** out to the
2aa20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2aa30 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69  if possible. Thi
2aa40 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79  s may involve sy
2aa50 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncing the.** jou
2aa60 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  rnal file. .**.*
2aa70 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2aa80 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2aa90 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c  keClean() is cal
2aaa0 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20  led on the page 
2aab0 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
2aac0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2aad0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2aae0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
2aaf0 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67   make the.** pag
2ab00 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20  e clean, the IO 
2ab10 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2ab20 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70  turned. If the p
2ab30 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  age cannot be.**
2ab40 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20   made clean for 
2ab50 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f  some other reaso
2ab60 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  n, but no error 
2ab70 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c  occurs, then SQL
2ab80 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
2ab90 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
2aba0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2abb0 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e  ) is not called.
2abc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2abd0 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20  agerStress(void 
2abe0 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  *p, PgHdr *pPg){
2abf0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2ac00 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20   = (Pager *)p;. 
2ac10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2ac20 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
2ac30 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
2ac40 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
2ac50 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2ac60 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a  R_DIRTY );..  /*
2ac70 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
2ac80 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
2ac90 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77  t during times w
2aca0 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63  hen doing a sync
2acb0 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   of.  ** journal
2acc0 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e   (and adding a n
2acd0 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f  ew header) is no
2ace0 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73  t allowed.  This
2acf0 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
2ad00 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ing calls to sql
2ad10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2ad20 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
2ad30 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c   journal multipl
2ad40 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c  e.  ** pages bel
2ad50 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61  onging to the sa
2ad60 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a  me sector..  **.
2ad70 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    ** The doNotSp
2ad80 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64  ill ROLLBACK and
2ad90 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62 69   OFF bits inhibi
2ada0 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69  ts all cache spi
2adb0 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72  lling.  ** regar
2adc0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2add0 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69   or not a sync i
2ade0 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69  s required.  Thi
2adf0 73 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a  s is set during.
2ae00 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
2ae10 6f 72 20 62 79 20 75 73 65 72 20 72 65 71 75 65  or by user reque
2ae20 73 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  st, respectively
2ae30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c  ..  **.  ** Spil
2ae40 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f  ling is also pro
2ae50 68 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20  hibited when in 
2ae60 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73  an error state s
2ae70 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a  ince that could.
2ae80 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74    ** lead to dat
2ae90 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
2aea0 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65  .   In the curre
2aeb0 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
2aec0 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d  n it .  ** is im
2aed0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c  possible for sql
2aee0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
2aef0 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77  ) to be called w
2af00 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d  ith createFlag==
2af10 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20  3.  ** while in 
2af20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
2af30 20 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70   hence it is imp
2af40 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73  ossible for this
2af50 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a   routine to.  **
2af60 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68   be called in th
2af70 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20  e error state.  
2af80 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65  Nevertheless, we
2af90 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52   include a NEVER
2afa0 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72  ().  ** test for
2afb0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2afc0 20 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20   as a safeguard 
2afd0 61 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63  against future c
2afe0 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  hanges..  */.  i
2aff0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
2b000 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
2b010 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b020 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2b030 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2b040 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
2b050 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  K );.  testcase(
2b060 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2b070 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2b080 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73  OFF );.  testcas
2b090 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2b0a0 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2b0b0 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66  G_NOSYNC );.  if
2b0c0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2b0d0 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61  pill.   && ((pPa
2b0e0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2b0f0 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c  & (SPILLFLAG_ROL
2b100 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f  LBACK|SPILLFLAG_
2b110 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c  OFF))!=0.      |
2b120 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  | (pPg->flags & 
2b130 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2b140 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  !=0).  ){.    re
2b150 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b160 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72    }..  pPg->pDir
2b170 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61  ty = 0;.  if( pa
2b180 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2b190 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74  ) ){.    /* Writ
2b1a0 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65  e a single frame
2b1b0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74   for this page t
2b1c0 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20  o the log. */.  
2b1d0 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
2b1e0 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a  esPage(pPg) ){ .
2b1f0 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
2b200 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20  urnalPage(pPg); 
2b210 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2b220 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b230 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2b240 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
2b250 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  , pPg, 0, 0);.  
2b260 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a    }.  }else{.  .
2b270 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
2b280 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
2b290 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
2b2a0 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
2b2b0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2b2c0 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  .     || pPager-
2b2d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
2b2e0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
2b2f0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
2b300 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
2b310 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ger, 1);.    }. 
2b320 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
2b330 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
2b340 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67  his page is larg
2b350 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
2b360 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  ent size of.    
2b370 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2b380 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65  image, it may ne
2b390 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ed to be written
2b3a0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
2b3b0 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  nal..    ** This
2b3c0 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
2b3d0 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72  call to pager_wr
2b3e0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62  ite_pagelist() b
2b3f0 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  elow will not.  
2b400 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72    ** actually wr
2b410 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  ite data to the 
2b420 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
2b430 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2b440 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   Consider the fo
2b450 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65  llowing sequence
2b460 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20   of events:.    
2b470 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49  **.    **   BEGI
2b480 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a  N;.    **     <j
2b490 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20  ournal page X>. 
2b4a0 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66     **     <modif
2b4b0 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a  y page X>.    **
2b4c0 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73       SAVEPOINT s
2b4d0 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  p;.    **       
2b4e0 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65  <shrink database
2b4f0 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73   file to Y pages
2b500 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70  >.    **       p
2b510 61 67 65 72 53 74 72 65 73 73 28 70 61 67 65 20  agerStress(page 
2b520 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f  X).    **     RO
2b530 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20  LLBACK TO sp;.  
2b540 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28    **.    ** If (
2b550 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20  X>Y), then when 
2b560 70 61 67 65 72 53 74 72 65 73 73 20 69 73 20 63  pagerStress is c
2b570 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c  alled page X wil
2b580 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  l not be written
2b590 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74  .    ** out to t
2b5a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b5b0 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72  , but will be dr
2b5c0 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  opped from the c
2b5d0 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20  ache. Then,.    
2b5e0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
2b5f0 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
2b600 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61  " statement, rea
2b610 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c  ding page X will
2b620 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74   read.    ** dat
2b630 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  a from the datab
2b640 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77  ase file. This w
2b650 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20  ill be the copy 
2b660 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a  of page X as it.
2b670 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20      ** was when 
2b680 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2b690 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20  started, not as 
2b6a0 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56  it was when "SAV
2b6b0 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a  EPOINT sp".    *
2b6c0 2a 20 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a  * was executed..
2b6d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2b6e0 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
2b6f0 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
2b700 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67 65  nt data for page
2b710 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20   X into the .   
2b720 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   ** sub-journal 
2b730 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20  file now (if it 
2b740 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74  is not already t
2b750 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69  here), so that i
2b760 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  t will.    ** be
2b770 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
2b780 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77   current value w
2b790 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  hen the "ROLLBAC
2b7a0 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20  K TO sp" is .   
2b7b0 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20   ** executed..  
2b7c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56    */.    if( NEV
2b7d0 45 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d  ER(.        rc==
2b7e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67  SQLITE_OK && pPg
2b7f0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
2b800 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71  bSize && subjReq
2b810 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20  uiresPage(pPg). 
2b820 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63     ) ){.      rc
2b830 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
2b840 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
2b850 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
2b860 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2b870 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68  e page out to th
2b880 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2b890 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2b8a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b8b0 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d     assert( (pPg-
2b8c0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2b8d0 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
2b8e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2b8f0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
2b900 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20  ager, pPg);.    
2b910 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  }.  }..  /* Mark
2b920 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
2b930 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  an. */.  if( rc=
2b940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b950 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2b960 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64  TRESS %d page %d
2b970 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2b980 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
2b990 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
2b9a0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
2b9b0 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
2b9c0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
2b9d0 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a  ager, rc); .}...
2b9e0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
2b9f0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  nd initialize a 
2ba00 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74  new Pager object
2ba10 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74   and put a point
2ba20 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a  er to it.** in *
2ba30 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67  ppPager. The pag
2ba40 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75  er should eventu
2ba50 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79  ally be freed by
2ba60 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74   passing it.** t
2ba70 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  o sqlite3PagerCl
2ba80 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ose()..**.** The
2ba90 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d   zFilename argum
2baa0 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20  ent is the path 
2bab0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2bac0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a  file to open..**
2bad0 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
2bae0 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
2baf0 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
2bb00 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
2bb10 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
2bb20 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
2bb30 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70   be cached. Temp
2bb40 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20  orary files are 
2bb50 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
2bb60 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
2bb70 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64   they are closed
2bb80 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  . If zFilename i
2bb90 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
2bba0 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d  n .** all inform
2bbb0 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
2bbc0 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65   cache. It is ne
2bbd0 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
2bbe0 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61  isk. .** This ca
2bbf0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
2bc00 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d  lement an in-mem
2bc10 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
2bc20 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70  .** The nExtra p
2bc30 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69  arameter specifi
2bc40 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
2bc50 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2bc60 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f  allocated.** alo
2bc70 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67  ng with each pag
2bc80 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69  e reference. Thi
2bc90 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c  s space is avail
2bca0 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
2bcb0 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69  .** via the sqli
2bcc0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
2bcd0 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68  () API..**.** Th
2bce0 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  e flags argument
2bcf0 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63   is used to spec
2bd00 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20 74  ify properties t
2bd10 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a  hat affect the.*
2bd20 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  * operation of t
2bd30 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f  he pager. It sho
2bd40 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73 6f  uld be passed so
2bd50 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69  me bitwise combi
2bd60 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  nation.** of the
2bd70 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a   PAGER_* flags..
2bd80 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61  **.** The vfsFla
2bd90 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  gs parameter is 
2bda0 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73  a bitmask to pas
2bdb0 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70  s to the flags p
2bdc0 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
2bdd0 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f  he xOpen() metho
2bde0 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  d of the supplie
2bdf0 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69  d VFS when openi
2be00 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a  ng files. .**.**
2be10 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   If the pager ob
2be20 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
2be30 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  d and the specif
2be40 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  ied file opened 
2be50 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
2be60 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2be70 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
2be80 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e  ager set to poin
2be90 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20  t to.** the new 
2bea0 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
2beb0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2bec0 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65  , *ppPager is se
2bed0 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64  t to NULL.** and
2bee0 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   error code retu
2bef0 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  rned. This funct
2bf00 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
2bf10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28  QLITE_NOMEM.** (
2bf20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20  sqlite3Malloc() 
2bf30 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
2bf40 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c  ate memory), SQL
2bf50 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20  ITE_CANTOPEN or 
2bf60 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49  .** various SQLI
2bf70 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73  TE_IO_XXX errors
2bf80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2bf90 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c  PagerOpen(.  sql
2bfa0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2bfb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
2bfc0 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  tual file system
2bfd0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67   to use */.  Pag
2bfe0 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
2bff0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
2c000 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
2c010 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
2c020 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c030 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
2c040 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2c050 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
2c060 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
2c070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2c080 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
2c090 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
2c0a0 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
2c0b0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2c0c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
2c0d0 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
2c0e0 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
2c0f0 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20  t vfsFlags,     
2c100 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2c110 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
2c120 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
2c130 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20  pen() */.  void 
2c140 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
2c150 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  e*) /* Function 
2c160 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20  to reinitialize 
2c170 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  pages */.){.  u8
2c180 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20   *pPtr;.  Pager 
2c190 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20  *pPager = 0;    
2c1a0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
2c1b0 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ct to allocate a
2c1c0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  nd return */.  i
2c1d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c1e0 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
2c1f0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2c200 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20  tempFile = 0;   
2c210 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2c220 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63   temp files (inc
2c230 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  l. in-memory fil
2c240 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d  es) */.  int mem
2c250 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Db = 0;         
2c260 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2c270 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
2c280 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2c290 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20  readOnly = 0;   
2c2a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2c2b0 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f  this is a read-o
2c2c0 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nly file */.  in
2c2d0 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
2c2e0 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20  e;     /* Bytes 
2c2f0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2c300 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20  each journal fd 
2c310 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  */.  char *zPath
2c320 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  name = 0;     /*
2c330 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61   Full path to da
2c340 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2c350 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d   int nPathname =
2c360 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
2c370 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2c380 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69  zPathname */.  i
2c390 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
2c3a0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
2c3b0 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
2c3c0 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69   /* False to omi
2c3d0 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  t journal */.  i
2c3e0 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20  nt pcacheSize = 
2c3f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
2c400 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79  e();       /* By
2c410 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2c420 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20  for PCache */.  
2c430 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  u32 szPageDflt =
2c440 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2c450 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44  PAGE_SIZE;  /* D
2c460 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2c470 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2c480 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f   *zUri = 0;    /
2c490 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f  * URI args to co
2c4a0 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69  py */.  int nUri
2c4b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2c4c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2c4d0 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73 20  tes of URI args 
2c4e0 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f  at *zUri */..  /
2c4f0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
2c500 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72   much space is r
2c510 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
2c520 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
2c530 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65  ndle.  ** (there
2c540 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d   are two of them
2c550 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  , the main journ
2c560 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a  al and the sub-j
2c570 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20  ournal). This.  
2c580 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ** is the maximu
2c590 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  m space required
2c5a0 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
2c5b0 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  y journal file h
2c5c0 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20  andle .  ** and 
2c5d0 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61  a regular journa
2c5e0 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e  l file-handle. N
2c5f0 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75  ote that a "regu
2c600 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64  lar journal-hand
2c610 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  le".  ** may be 
2c620 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c  a wrapper capabl
2c630 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65  e of caching the
2c640 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f   first portion o
2c650 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
2c660 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72  ** file in memor
2c670 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  y to implement t
2c680 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
2c690 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65  optimization (se
2c6a0 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66  e .  ** source f
2c6b0 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a  ile journal.c)..
2c6c0 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
2c6d0 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
2c6e0 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  fs)>sqlite3MemJo
2c6f0 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20  urnalSize() ){. 
2c700 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
2c710 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
2c720 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
2c730 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Vfs));.  }else{.
2c740 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
2c750 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
2c760 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
2c770 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ze());.  }..  /*
2c780 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
2c790 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c  variable to NULL
2c7a0 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   in case an erro
2c7b0 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a  r occurs. */.  *
2c7c0 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69  ppPager = 0;..#i
2c7d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c7e0 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28  T_MEMORYDB.  if(
2c7f0 20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d   flags & PAGER_M
2c800 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d  EMORY ){.    mem
2c810 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  Db = 1;.    if( 
2c820 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2c830 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2c840 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
2c850 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
2c860 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
2c870 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2c880 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53  e==0  ) return S
2c890 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2c8a0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2c8b0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2c8c0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
2c8d0 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
2c8e0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2c8f0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
2c900 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
2c910 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
2c920 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
2c930 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
2c940 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
2c950 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
2c960 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
2c970 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2c980 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
2c990 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
2c9a0 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
2c9b0 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
2c9c0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2c9d0 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2c9e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
2c9f0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2ca00 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2ca10 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d  +1;.    zPathnam
2ca20 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
2ca30 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e  locRaw(0, nPathn
2ca40 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
2ca50 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
2ca60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ca70 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2ca80 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30  .    zPathname[0
2ca90 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73  ] = 0; /* Make s
2caa0 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ure initialized 
2cab0 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68  even if FullPath
2cac0 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a  name() fails */.
2cad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cae0 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
2caf0 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
2cb00 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68  nPathname, zPath
2cb10 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68  name);.    nPath
2cb20 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
2cb30 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
2cb40 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20  );.    z = zUri 
2cb50 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c  = &zFilename[sql
2cb60 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
2cb70 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20  lename)+1];.    
2cb80 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
2cb90 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53     z += sqlite3S
2cba0 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20  trlen30(z)+1;.  
2cbb0 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
2cbc0 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20  Strlen30(z)+1;. 
2cbd0 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20     }.    nUri = 
2cbe0 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55  (int)(&z[1] - zU
2cbf0 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ri);.    assert(
2cc00 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20   nUri>=0 );.    
2cc10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2cc20 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38  K && nPathname+8
2cc30 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
2cc40 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
2cc50 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
2cc60 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  en when the jour
2cc70 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65  nal path require
2cc80 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  d by.      ** th
2cc90 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
2cca0 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20   opened will be 
2ccb0 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e  more than pVfs->
2ccc0 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20  mxPathname.     
2ccd0 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e   ** bytes in len
2cce0 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  gth. This means 
2ccf0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
2cd00 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20  not be opened,. 
2cd10 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69       ** as it wi
2cd20 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
2cd30 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
2cd40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65  ournal file or e
2cd50 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65  ven.      ** che
2cd60 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ck for a hot-jou
2cd70 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64  rnal before read
2cd80 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
2cd90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2cda0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
2cdb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
2cdc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cdd0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2cde0 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2cdf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2ce00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2ce10 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
2ce20 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20  y for the Pager 
2ce30 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68  structure, PCach
2ce40 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20  e object, the.  
2ce50 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65  ** three file de
2ce60 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64  scriptors, the d
2ce70 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2ce80 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  e and the journa
2ce90 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  l .  ** file nam
2cea0 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e  e. The layout in
2ceb0 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f   memory is as fo
2cec0 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
2ced0 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63       Pager objec
2cee0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2cef0 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67       (sizeof(Pag
2cf00 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  er) bytes).  ** 
2cf10 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63      PCache objec
2cf20 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2cf30 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63      (sqlite3Pcac
2cf40 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a  heSize() bytes).
2cf50 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2cf60 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  e file handle   
2cf70 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e           (pVfs->
2cf80 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a  szOsFile bytes).
2cf90 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75    **     Sub-jou
2cfa0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2cfb0 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61           (journa
2cfc0 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
2cfd0 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a  .  **     Main j
2cfe0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2cff0 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  le        (journ
2d000 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2d010 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2d020 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  ase file name   
2d030 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2d040 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20  hname+1 bytes). 
2d050 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20   **     Journal 
2d060 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2d070 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2d080 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20  me+8+1 bytes).  
2d090 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20  */.  pPtr = (u8 
2d0a0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
2d0b0 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28  ero(.    ROUND8(
2d0c0 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
2d0d0 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72   +      /* Pager
2d0e0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
2d0f0 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53    ROUND8(pcacheS
2d100 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ize) +          
2d110 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
2d120 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  t */.    ROUND8(
2d130 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20  pVfs->szOsFile) 
2d140 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d  +       /* The m
2d150 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
2d160 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
2d170 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  ze * 2 +        
2d180 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
2d190 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
2d1a0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31     nPathname + 1
2d1b0 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20   + nUri +       
2d1c0 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a    /* zFilename *
2d1d0 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  /.    nPathname 
2d1e0 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20 20 20  + 8 + 2         
2d1f0 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c       /* zJournal
2d200 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2d210 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
2d220 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20  + nPathname + 4 
2d230 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 2f  + 2            /
2d240 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66  * zWal */.#endif
2d250 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
2d260 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2d270 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f  MENT(SQLITE_INT_
2d280 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69  TO_PTR(journalFi
2d290 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66  leSize)) );.  if
2d2a0 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73  ( !pPtr ){.    s
2d2b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2d2c0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2d2d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2d2e0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MEM;.  }.  pPage
2d2f0 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  r =             
2d300 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b   (Pager*)(pPtr);
2d310 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  .  pPager->pPCac
2d320 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a  he =    (PCache*
2d330 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2d340 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2d350 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ));.  pPager->fd
2d360 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69   =   (sqlite3_fi
2d370 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2d380 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29  ND8(pcacheSize))
2d390 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  ;.  pPager->sjfd
2d3a0 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
2d3b0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2d3c0 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2d3d0 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  ));.  pPager->jf
2d3e0 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69  d =  (sqlite3_fi
2d3f0 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  le*)(pPtr += jou
2d400 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
2d410 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2d420 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28  me =    (char*)(
2d430 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
2d440 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  ileSize);.  asse
2d450 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2d460 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d  LIGNMENT(pPager-
2d470 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  >jfd) );..  /* F
2d480 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72  ill in the Pager
2d490 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50  .zFilename and P
2d4a0 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75  ager.zJournal bu
2d4b0 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72  ffers, if requir
2d4c0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  ed. */.  if( zPa
2d4d0 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  thname ){.    as
2d4e0 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e  sert( nPathname>
2d4f0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
2d500 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63  >zJournal =   (c
2d510 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50  har*)(pPtr += nP
2d520 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55  athname + 1 + nU
2d530 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ri);.    memcpy(
2d540 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2d550 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  e, zPathname, nP
2d560 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  athname);.    if
2d570 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28  ( nUri ) memcpy(
2d580 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  &pPager->zFilena
2d590 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c  me[nPathname+1],
2d5a0 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20   zUri, nUri);.  
2d5b0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2d5c0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68  >zJournal, zPath
2d5d0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2d5e0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
2d5f0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
2d600 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
2d610 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b  rnal\000", 8+2);
2d620 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65  .    sqlite3File
2d630 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e  Suffix3(pPager->
2d640 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2d650 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69  r->zJournal);.#i
2d660 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d670 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72  T_WAL.    pPager
2d680 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72  ->zWal = &pPager
2d690 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68  ->zJournal[nPath
2d6a0 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d  name+8+1];.    m
2d6b0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57  emcpy(pPager->zW
2d6c0 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
2d6d0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
2d6e0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2d6f0 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  Wal[nPathname], 
2d700 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29  "-wal\000", 4+1)
2d710 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
2d720 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d  eSuffix3(pPager-
2d730 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2d740 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69  er->zWal);.#endi
2d750 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  f.    sqlite3DbF
2d760 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65  ree(0, zPathname
2d770 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
2d780 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
2d790 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
2d7a0 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20   = vfsFlags;..  
2d7b0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65  /* Open the page
2d7c0 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  r file..  */.  i
2d7d0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
2d7e0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
2d7f0 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
2d800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d810 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
2d820 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f  s returned by xO
2d830 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20  pen() */.    rc 
2d840 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
2d850 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46  pVfs, pPager->zF
2d860 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2d870 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26  >fd, vfsFlags, &
2d880 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72  fout);.    asser
2d890 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20  t( !memDb );.   
2d8a0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75   readOnly = (fou
2d8b0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
2d8c0 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a  ADONLY);..    /*
2d8d0 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
2d8e0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
2d8f0 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72  ened for read/wr
2d900 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20  ite access,.    
2d910 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61  ** choose a defa
2d920 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e  ult page size in
2d930 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f   case we have to
2d940 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20   create the.    
2d950 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2d960 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61  . The default pa
2d970 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d  ge size is the m
2d980 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a  aximum of:.    *
2d990 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51  *.    **    + SQ
2d9a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2d9b0 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20  E_SIZE,.    **  
2d9c0 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65    + The value re
2d9d0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
2d9e0 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a  3OsSectorSize().
2d9f0 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
2da00 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a  largest page siz
2da10 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72  e that can be wr
2da20 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
2da30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2da40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2da50 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63 20  {.      int iDc 
2da60 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
2da70 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
2da80 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
2da90 20 20 20 20 69 66 28 20 21 72 65 61 64 4f 6e 6c      if( !readOnl
2daa0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74  y ){.        set
2dab0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
2dac0 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
2dad0 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rt(SQLITE_DEFAUL
2dae0 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c  T_PAGE_SIZE<=SQL
2daf0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2db00 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
2db10 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
2db20 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  lt<pPager->secto
2db30 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
2db40 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
2db50 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45  ectorSize>SQLITE
2db60 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2db70 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
2db80 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2db90 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45   = SQLITE_MAX_DE
2dba0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2dbb0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2dbc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
2dbd0 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29  PageDflt = (u32)
2dbe0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2dbf0 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ze;.          }.
2dc00 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66          }.#ifdef
2dc10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2dc20 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
2dc30 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
2dc40 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
2dc50 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2dc60 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d  IOCAP_ATOMIC512=
2dc70 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20  =(512>>8));.    
2dc80 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2dc90 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2dca0 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
2dcb0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2dcc0 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  rt(SQLITE_MAX_DE
2dcd0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
2dce0 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20  =65536);.       
2dcf0 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65     for(ii=szPage
2dd00 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45  Dflt; ii<=SQLITE
2dd10 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2dd20 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29  E_SIZE; ii=ii*2)
2dd30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2dd40 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f  ( iDc&(SQLITE_IO
2dd50 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e  CAP_ATOMIC|(ii>>
2dd60 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  8)) ){.         
2dd70 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2dd80 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  = ii;.          
2dd90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2dda0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
2ddb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2ddc0 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20  Pager->noLock = 
2ddd0 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
2dde0 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ean(zFilename, "
2ddf0 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20  nolock", 0);.   
2de00 20 20 20 69 66 28 20 28 69 44 63 20 26 20 53 51     if( (iDc & SQ
2de10 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54  LITE_IOCAP_IMMUT
2de20 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20 20 20  ABLE)!=0.       
2de30 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  || sqlite3_uri_b
2de40 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65  oolean(zFilename
2de50 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30  , "immutable", 0
2de60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76  ) ){.          v
2de70 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
2de80 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
2de90 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2dea0 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69  act_like_temp_fi
2deb0 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
2dec0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
2ded0 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79  * If a temporary
2dee0 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74   file is request
2def0 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70  ed, it is not op
2df00 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ened immediately
2df10 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
2df20 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20   case we accept 
2df30 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
2df40 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20   size and delay 
2df50 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  actually.    ** 
2df60 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  opening the file
2df70 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
2df80 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65   call to OsWrite
2df90 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
2dfa0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2dfb0 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e   also run for an
2dfc0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2dfd0 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72  ase. An in-memor
2dfe0 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  y.    ** databas
2dff0 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
2e000 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61   a temp-file tha
2e010 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
2e020 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a  en out to.    **
2e030 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61   disk and uses a
2e040 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c  n in-memory roll
2e050 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  back journal..  
2e060 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
2e070 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e   branch also run
2e080 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b  s for files mark
2e090 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e  ed as immutable.
2e0a0 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b  .    */ .act_lik
2e0b0 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20  e_temp_file:.   
2e0c0 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
2e0d0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
2e0e0 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
2e0f0 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64  ;     /* Pretend
2e100 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
2e110 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70   a lock */.    p
2e120 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45  Pager->eLock = E
2e130 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20  XCLUSIVE_LOCK;  
2e140 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20    /* Pretend we 
2e150 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49 56 45  are in EXCLUSIVE
2e160 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50 61   mode */.    pPa
2e170 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b  ger->noLock = 1;
2e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e190 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67  /* Do no locking
2e1a0 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79   */.    readOnly
2e1b0 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c   = (vfsFlags&SQL
2e1c0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2e1d0 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  Y);.  }..  /* Th
2e1e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  e following call
2e1f0 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65   to PagerSetPage
2e200 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f  size() serves to
2e210 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   set the value o
2e220 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61  f .  ** Pager.pa
2e230 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c  geSize and to al
2e240 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72  locate the Pager
2e250 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
2e260 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
2e270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e280 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e290 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20  r->memDb==0 );. 
2e2a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e2b0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
2e2c0 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44  pPager, &szPageD
2e2d0 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  flt, -1);.    te
2e2e0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
2e2f0 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20  TE_OK );.  }..  
2e300 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
2e310 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e  e PCache object.
2e320 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2e330 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2e340 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30  ssert( nExtra<10
2e350 30 30 20 29 3b 0a 20 20 20 20 6e 45 78 74 72 61  00 );.    nExtra
2e360 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61   = ROUND8(nExtra
2e370 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2e380 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
2e390 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
2e3a0 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3c0 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
2e3d0 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
2e3e0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
2e3f0 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20  PCache);.  }..  
2e400 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2e410 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 20 66  ccurred above, f
2e420 72 65 65 20 74 68 65 20 20 50 61 67 65 72 20 73  ree the  Pager s
2e430 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
2e440 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
2e450 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
2e460 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2e470 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
2e480 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
2e490 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
2e4a0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
2e4b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2e4c0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
2e4d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2e4e0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
2e4f0 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
2e500 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
2e510 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
2e520 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
2e530 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
2e540 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
2e550 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e560 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
2e570 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
2e580 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20  seJournal;.  /* 
2e590 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
2e5a0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e5b0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
2e5c0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e5d0 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
2e5e0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2e5f0 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
2e600 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2e610 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
2e620 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
2e630 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
2e640 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
2e650 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
2e660 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
2e670 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
2e680 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70  NLOCK; */.  /* p
2e690 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
2e6a0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2e6b0 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29  >tempFile = (u8)
2e6c0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
2e6d0 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
2e6e0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2e6f0 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
2e700 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
2e710 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2e720 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
2e730 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
2e740 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2e750 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
2e760 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2e770 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2e780 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  ; .  pPager->cha
2e790 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
2e7a0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
2e7b0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
2e7c0 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
2e7d0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
2e7e0 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
2e7f0 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f  .  assert( useJo
2e800 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d  urnal || pPager-
2e810 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70  >tempFile );.  p
2e820 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
2e830 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2e840 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2e850 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
2e860 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
2e870 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  llSync==0 );.   
2e880 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e890 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  >syncFlags==0 );
2e8a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e8b0 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
2e8c0 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  s==0 );.    asse
2e8d0 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  rt( pPager->ckpt
2e8e0 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  SyncFlags==0 );.
2e8f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
2e900 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
2e910 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
2e920 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2e930 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
2e940 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
2e950 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2e960 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57  _SYNC_NORMAL | W
2e970 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54  AL_SYNC_TRANSACT
2e980 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72  IONS;.    pPager
2e990 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
2e9a0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2e9b0 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  RMAL;.  }.  /* p
2e9c0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
2e9d0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2e9e0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
2e9f0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2ea00 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
2ea10 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
2ea20 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72  tra = (u16)nExtr
2ea30 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
2ea40 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
2ea50 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
2ea60 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
2ea70 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  T;.  assert( isO
2ea80 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2ea90 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  || tempFile );. 
2eaa0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
2eab0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75  Pager);.  if( !u
2eac0 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
2ead0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2eae0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
2eaf0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20  RNALMODE_OFF;.  
2eb00 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20  }else if( memDb 
2eb10 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2eb20 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2eb30 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2eb40 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  EMORY;.  }.  /* 
2eb50 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
2eb60 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
2eb70 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
2eb80 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a  andlerArg = 0; *
2eb90 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  /.  pPager->xRei
2eba0 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
2ebb0 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
2ebc0 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
2ebd0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
2ebe0 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70  ash)); */.  /* p
2ebf0 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20  Pager->szMmap = 
2ec00 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d  SQLITE_DEFAULT_M
2ec10 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c  MAP_SIZE // will
2ec20 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65 65   be set by btree
2ec30 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65  .c */..  *ppPage
2ec40 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
2ec50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ec60 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
2ec70 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
2ec80 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20  file has not be 
2ec90 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d  deleted or renam
2eca0 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75  ed out from.** u
2ecb0 6e 64 65 72 20 74 68 65 20 70 61 67 65 72 2e 20  nder the pager. 
2ecc0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2ecd0 4b 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  K if the databas
2ece0 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20  e is still were 
2ecf0 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62  it ought.** to b
2ed00 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75  e on disk.  Retu
2ed10 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c  rn non-zero (SQL
2ed20 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
2ed30 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68  OVED or some oth
2ed40 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  er error.** code
2ed50 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41   from sqlite3OsA
2ed60 63 63 65 73 73 28 29 29 20 69 66 20 74 68 65 20  ccess()) if the 
2ed70 64 61 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e  database has gon
2ed80 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74  e missing..*/.st
2ed90 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73  atic int databas
2eda0 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72  eIsUnmoved(Pager
2edb0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2edc0 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a   bHasMoved = 0;.
2edd0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
2ede0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2edf0 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
2ee00 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
2ee10 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20  er->dbSize==0 ) 
2ee20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ee30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2ee40 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26  er->zFilename &&
2ee50 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2ee60 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20  me[0] );.  rc = 
2ee70 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
2ee80 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
2ee90 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41   SQLITE_FCNTL_HA
2eea0 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f  S_MOVED, &bHasMo
2eeb0 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ved);.  if( rc==
2eec0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
2eed0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
2eee0 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d   HAS_MOVED file-
2eef0 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70  control is unimp
2ef00 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65  lemented, assume
2ef10 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20   that the file. 
2ef20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
2ef30 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20  en moved.  That 
2ef40 69 73 20 74 68 65 20 68 69 73 74 6f 72 69 63 61  is the historica
2ef50 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51  l behavior of SQ
2ef60 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20  Lite: prior to. 
2ef70 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
2ef80 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68  8.3, it never ch
2ef90 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20  ecked */.    rc 
2efa0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2efb0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2efc0 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f  ITE_OK && bHasMo
2efd0 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ved ){.    rc = 
2efe0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
2eff0 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72  DBMOVED;.  }.  r
2f000 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2f010 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2f020 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  n is called afte
2f030 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  r transitioning 
2f040 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  from PAGER_UNLOC
2f050 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48  K to.** PAGER_SH
2f060 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74  ARED state. It t
2f070 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73  ests if there is
2f080 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70   a hot journal p
2f090 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
2f0a0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2f0b0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
2f0c0 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  . A hot journal 
2f0d0 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20  is one that .** 
2f0e0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
2f0f0 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69  ed back. Accordi
2f100 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ng to this funct
2f110 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ion, a hot-journ
2f120 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74  al.** file exist
2f130 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
2f140 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20  ng criteria are 
2f150 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  met:.**.**   * T
2f160 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f170 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
2f180 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a  le system, and.*
2f190 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73  *   * No process
2f1a0 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
2f1b0 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
2f1c0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2f1d0 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  e file, and.**  
2f1e0 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
2f1f0 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67  file itself is g
2f200 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79  reater than 0 by
2f210 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64  tes in size, and
2f220 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73  .**   * The firs
2f230 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f  t byte of the jo
2f240 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2f250 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30  s and is not 0x0
2f260 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
2f270 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
2f280 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f290 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
2f2a0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
2f2b0 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
2f2c0 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
2f2d0 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
2f2e0 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
2f2f0 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
2f300 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74   same name. In t
2f310 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
2f320 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
2f330 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69  just deleted usi
2f340 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45  ng OsDelete, *pE
2f350 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
2f360 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a  0 and SQLITE_OK.
2f370 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
2f380 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2f390 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63  ne does not chec
2f3a0 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  k if there is a 
2f3b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2f3c0 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68  ilename.** at th
2f3d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
2f3e0 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  e. If there is, 
2f3f0 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20  and that master 
2f400 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2f410 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2f420 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
2f430 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
2f440 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73  lly hot. In this
2f450 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f  .** case this ro
2f460 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
2f470 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2f480 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c  ve. The pager_pl
2f490 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  ayback().** rout
2f4a0 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
2f4b0 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  r that the journ
2f4c0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
2f4d0 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a  eally hot and .*
2f4e0 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
2f4f0 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20  it back. .**.** 
2f500 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  If a hot-journal
2f510 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74   file is found t
2f520 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74  o exist, *pExist
2f530 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e  s is set to 1 an
2f540 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d .** SQLITE_OK 
2f550 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20  returned. If no 
2f560 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2f570 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45   is present, *pE
2f580 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20  xists is.** set 
2f590 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
2f5a0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2f5b0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2f5c0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a  rs while trying.
2f5d0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
2f5e0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2f5f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2f600 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f  e exists, the IO
2f610 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69   error.** code i
2f620 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
2f630 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78  he value of *pEx
2f640 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65  ists is undefine
2f650 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2f660 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
2f670 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
2f680 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73  t *pExists){.  s
2f690 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
2f6a0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
2f6b0 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
2f6c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2f6d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2f6e0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2f6f0 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20  exists = 1;     
2f700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2f710 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  e if a journal f
2f720 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ile is present *
2f730 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e  /.  int jrnlOpen
2f740 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67   = !!isOpen(pPag
2f750 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73  er->jfd);..  ass
2f760 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2f770 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
2f780 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2f790 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
2f7a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
2f7b0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
2f7c0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72  );..  assert( jr
2f7d0 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73  nlOpen==0 || ( s
2f7e0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2f7f0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2f800 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20  ager->jfd) &.   
2f810 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
2f820 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
2f830 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45  PEN.  ));..  *pE
2f840 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28  xists = 0;.  if(
2f850 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2f860 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2f870 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
2f880 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
2f890 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2f8a0 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
2f8b0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2f8c0 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
2f8d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b   ){.    int lock
2f8e0 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
2f8f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
2f900 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  ome process hold
2f910 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
2f920 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63  k */..    /* Rac
2f930 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65  e condition here
2f940 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65  :  Another proce
2f950 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  ss might have be
2f960 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  en holding the. 
2f970 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56     ** the RESERV
2f980 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65  ED lock and have
2f990 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20   a journal open 
2f9a0 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  at the sqlite3Os
2f9b0 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a  Access() .    **
2f9c0 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74   call above, but
2f9d0 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65   then delete the
2f9e0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f   journal and dro
2f9f0 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72  p the lock befor
2fa00 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20  e.    ** we get 
2fa10 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2fa20 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
2fa30 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61  eservedLock() ca
2fa40 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20  ll.  If that.   
2fa50 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c   ** is the case,
2fa60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
2fa70 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20  ght think there 
2fa80 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
2fa90 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20   when.    ** in 
2faa0 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f  fact there is no
2fab0 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74  ne.  This result
2fac0 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  s in a false-pos
2fad0 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c  itive which will
2fae0 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74  .    ** be dealt
2faf0 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61   with by the pla
2fb00 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20  yback routine.  
2fb10 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20  Ticket #3883..  
2fb20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2fb30 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2fb40 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
2fb50 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20  >fd, &locked);. 
2fb60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2fb70 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20  E_OK && !locked 
2fb80 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  ){.      Pgno nP
2fb90 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2fba0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2fbb0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
2fbc0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
2fbd0 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
2fbe0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
2fbf0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
2fc00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fc10 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
2fc20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2fc30 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73   zero pages in s
2fc40 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ize, that means 
2fc50 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29 20  that either (1) 
2fc60 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
2fc70 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e  ournal is a remn
2fc80 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ant from a prior
2fc90 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
2fca0 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65  he same name whe
2fcb0 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  re.        ** th
2fcc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fcd0 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72  but not the jour
2fce0 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c  nal was deleted,
2fcf0 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69 74   or (2) the init
2fd00 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ial.        ** t
2fd10 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
2fd20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20  populates a new 
2fd30 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69 6e  database is bein
2fd40 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  g rolled back.. 
2fd50 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74         ** In eit
2fd60 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f  her case, the jo
2fd70 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62  urnal file can b
2fd80 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65  e deleted.  Howe
2fd90 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20  ver, take care. 
2fda0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f         ** not to
2fdb0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2fdc0 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
2fdd0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64  s already open d
2fde0 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  ue to.        **
2fdf0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
2fe00 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a  RSIST..        *
2fe10 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  /.        if( nP
2fe20 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f  age==0 && !jrnlO
2fe30 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
2fe40 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
2fe50 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
2fe60 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72         if( pager
2fe70 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
2fe80 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
2fe90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
2feb0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
2fec0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2fed0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2fee0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
2fef0 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67  lusiveMode ) pag
2ff00 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
2ff10 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
2ff20 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ff30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
2ff40 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
2ff50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2ff60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2ff70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2ff80 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
2ff90 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
2ffa0 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
2ffb0 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
2ffc0 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
2ffd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
2ffe0 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
2fff0 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
30000 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
30010 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
30020 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
30030 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30040 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
30050 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
30060 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
30070 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
30080 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
30090 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
300a0 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
300b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
300c0 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
300d0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
300e0 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
300f0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
30100 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
30110 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
30120 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30130 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
30140 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
30150 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
30160 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  &f);.          }
30170 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
30180 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30190 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
301a0 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
301b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
301c0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
301d0 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
301e0 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
301f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
30200 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
30210 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
30220 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
30230 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
30240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30250 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
30260 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
30270 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
30280 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
30290 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
302a0 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
302b0 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b  ts = (first!=0);
302c0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
302d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
302e0 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
302f0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
30300 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65   cannot open the
30310 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
30320 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  l file in order 
30330 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20  to see if.      
30340 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20        ** it has 
30350 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74  a zero header, t
30360 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75 65  hat might be due
30370 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72   to an I/O error
30380 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20  , or.           
30390 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
303a0 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65 20  due to the race 
303b0 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
303c0 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e  bed above and in
303d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
303e0 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45  ticket #3883.  E
303f0 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d  ither way, assum
30400 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
30410 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20  al is hot..     
30420 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d         ** This m
30430 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65 20  ight be a false 
30440 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20 69  positive.  But i
30450 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68  f it is, then th
30460 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
30470 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e   automatic journ
30480 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20  al playback and 
30490 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69  recovery mechani
304a0 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20  sm will deal.   
304b0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68           ** with
304c0 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43   it under an EXC
304d0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72  LUSIVE lock wher
304e0 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  e we do not need
304f0 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20   to.            
30500 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68  ** worry so much
30510 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69   with race condi
30520 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20  tions..         
30530 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
30540 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a    *pExists = 1;.
30550 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30560 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
30570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30580 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
30590 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
305a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
305b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
305c0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ed to obtain a s
305d0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
305e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
305f0 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
30600 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  l to call sqlite
30610 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29 20  3PagerAcquire() 
30620 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69 73  until after this
30630 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73   function.** has
30640 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
30650 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20  ly called. If a 
30660 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61  shared-lock is a
30670 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e  lready held when
30680 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
30690 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
306a0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
306b0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
306c0 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61  operations are a
306d0 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79  lso performed by
306e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
306f0 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68  **.**   1) If th
30700 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65  e pager is curre
30710 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50  ntly in PAGER_OP
30720 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63  EN state (no loc
30730 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f  k held.**      o
30740 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
30750 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74  ile), then an at
30760 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
30770 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20   obtain a.**    
30780 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e    SHARED lock on
30790 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
307a0 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20  le. Immediately 
307b0 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a  after obtaining.
307c0 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52  **      the SHAR
307d0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c  ED lock, the fil
307e0 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63  e-system is chec
307f0 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ked for a hot-jo
30800 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77  urnal,.**      w
30810 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62  hich is played b
30820 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20  ack if present. 
30830 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f  Following any ho
30840 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20  t-journal .**   
30850 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65     rollback, the
30860 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
30870 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64   cache are valid
30880 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67  ated by checking
30890 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68  .**      the 'ch
308a0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69  ange-counter' fi
308b0 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  eld of the datab
308c0 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20  ase file header 
308d0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63  and.**      disc
308e0 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72  arded if they ar
308f0 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e  e found to be in
30900 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32  valid..**.**   2
30910 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
30920 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
30930 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64  lusive-mode, and
30940 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65   there are curre
30950 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20  ntly.**      no 
30960 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
30970 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61  rences to any pa
30980 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74  ges, and is in t
30990 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a  he error state,.
309a0 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20  **      then an 
309b0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
309c0 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  to clear the err
309d0 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63  or state by disc
309e0 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  arding.**      t
309f0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
30a00 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  he page cache an
30a10 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  d rolling back a
30a20 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a  ny open journal.
30a30 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a  **      file..**
30a40 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
30a50 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
30a60 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
30a70 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
30a80 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
30a90 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  s while locking 
30aa0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68  the database, ch
30ab0 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74  ecking for a hot
30ac0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72  -journal file or
30ad0 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63   .** rolling bac
30ae0 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
30af0 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
30b00 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
30b10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
30b20 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50  agerSharedLock(P
30b30 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
30b40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
30b50 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
30b60 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
30b70 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  de */..  /* This
30b80 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
30b90 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74   called from b-t
30ba0 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65  ree and only whe
30bb0 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  n there are no. 
30bc0 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   ** outstanding 
30bd0 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c  pages. This impl
30be0 69 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ies that the pag
30bf0 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20  er state should 
30c00 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f  either.  ** be O
30c10 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52  PEN or READER. R
30c20 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f  EADER is only po
30c30 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 70 61  ssible if the pa
30c40 67 65 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e  ger is or was in
30c50 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65   .  ** exclusive
30c60 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20   access mode..  
30c70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
30c80 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
30c90 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
30ca0 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  he)==0 );.  asse
30cb0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
30cc0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
30cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
30ce0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
30cf0 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
30d00 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30d10 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20  READER );.  if( 
30d20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70  NEVER(MEMDB && p
30d30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
30d40 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  ){ return pPager
30d50 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20  ->errCode; }..  
30d60 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
30d70 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67  (pPager) && pPag
30d80 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
30d90 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e  R_OPEN ){.    in
30da0 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20  t bHotJournal = 
30db0 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  1;          /* T
30dc0 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69  rue if there exi
30dd0 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  sts a hot journa
30de0 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61  l-file */..    a
30df0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
30e00 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ..    rc = pager
30e10 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
30e20 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
30e30 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
30e40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30e50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
30e60 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
30e70 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  K || pPager->eLo
30e80 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
30e90 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   );.      goto f
30ea0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
30eb0 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
30ec0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
30ed0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
30ee0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
30ef0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
30f00 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  ase file, then i
30f10 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74  t either needs t
30f20 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
30f30 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   or deleted..   
30f40 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
30f50 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  er->eLock<=SHARE
30f60 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
30f70 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e  rc = hasHotJourn
30f80 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74  al(pPager, &bHot
30f90 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a  Journal);.    }.
30fa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30fb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
30fc0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
30fd0 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f  }.    if( bHotJo
30fe0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
30ff0 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
31000 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nly ){.        r
31010 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
31020 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  NLY_ROLLBACK;.  
31030 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
31040 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
31050 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
31060 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
31070 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
31080 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
31090 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
310a0 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
310b0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
310c0 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
310d0 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
310e0 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
310f0 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
31100 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
31110 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
31120 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
31130 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
31140 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
31150 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
31160 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
31170 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
31180 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
31190 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
311a0 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
311b0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68   the .      ** h
311c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e  ot-journal back.
311d0 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
311e0 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
311f0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
31200 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
31210 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79  t requested, any
31220 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
31230 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69  process attempti
31240 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ng to access the
31250 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
31260 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20  ill get to .    
31270 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20    ** this point 
31280 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
31290 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69  fail to obtain i
312a0 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
312b0 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20   lock .      ** 
312c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
312d0 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  file..      **. 
312e0 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74       ** Unless t
312f0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c  he pager is in l
31300 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
31310 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20  usive mode, the 
31320 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a  lock is.      **
31330 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53   downgraded to S
31340 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72  HARED_LOCK befor
31350 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
31360 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a  returns..      *
31370 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
31380 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
31390 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
313a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
313b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
313c0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
313d0 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  ;.      }. .    
313e0 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    /* If it is no
313f0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61  t already open a
31400 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  nd the file exis
31410 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e  ts on disk, open
31420 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a   the .      ** j
31430 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
31440 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57 72  write access. Wr
31450 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72 65  ite access is re
31460 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 0a  quired because .
31470 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c        ** in excl
31480 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
31490 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
314a0 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65  iptor will be ke
314b0 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a  pt open .      *
314c0 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75  * and possibly u
314d0 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
314e0 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
314f0 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65  Also, write-acce
31500 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ss .      ** is 
31510 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64  usually required
31520 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
31530 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72   journal in jour
31540 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74  nal_mode=persist
31550 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20   .      ** mode 
31560 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f  (and also for jo
31570 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63  urnal_mode=trunc
31580 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  ate on some syst
31590 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ems)..      **. 
315a0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a       ** If the j
315b0 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
315c0 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c  exist, it usuall
315d0 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d  y means that som
315e0 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  e .      ** othe
315f0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e  r connection man
31600 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61  aged to get in a
31610 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  nd roll it back 
31620 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  before .      **
31630 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
31640 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78   obtained the ex
31650 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f  clusive lock abo
31660 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20  ve. Or, it .    
31670 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68    ** may mean th
31680 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73  at the pager was
31690 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74   in the error-st
316a0 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20  ate when this.  
316b0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
316c0 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74  was called and t
316d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
316e0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
316f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31700 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
31710 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
31720 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
31730 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
31740 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
31750 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b      int bExists;
31760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31770 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
31780 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
31790 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
317a0 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
317b0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
317c0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
317d0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
317e0 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74 73  EXISTS, &bExists
317f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
31800 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31810 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  bExists ){.     
31820 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
31830 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
31840 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
31850 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
31860 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
31870 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61  NAL;.          a
31880 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
31890 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
318a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
318b0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
318c0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
318d0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
318e0 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20   &fout);.       
318f0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
31900 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
31910 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
31920 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
31930 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
31940 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50  & fout&SQLITE_OP
31950 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20  EN_READONLY ){. 
31960 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
31970 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
31980 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
31990 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
319a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
319b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
319c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20     }.      }. . 
319d0 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
319e0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
319f0 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
31a00 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
31a10 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  e.      ** lock 
31a20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
31a30 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72  e read lock. Pur
31a40 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66  ge the cache bef
31a50 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61  ore.      ** pla
31a60 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f  ying back the ho
31a70 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61  t-journal so tha
31a80 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75  t we don't end u
31a90 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  p with.      ** 
31aa0 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
31ab0 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65  cache.  Sync the
31ac0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66   hot journal bef
31ad0 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20  ore playing.    
31ae0 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e    ** it back sin
31af0 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ce the process t
31b00 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64 20  hat crashed and 
31b10 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75  left the hot jou
31b20 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72  rnal.      ** pr
31b30 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73  obably did not s
31b40 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61 72  ync it and we ar
31b50 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c  e required to al
31b60 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20  ways sync.      
31b70 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ** the journal b
31b80 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74  efore playing it
31b90 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   back..      */.
31ba0 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
31bb0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
31bc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31bd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31be0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
31bf0 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
31c00 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
31c10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31c20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31c30 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
31c40 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
31c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
31c60 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
31c70 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20  GER_OPEN;.      
31c80 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
31c90 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
31ca0 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
31cb0 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63        pagerUnloc
31cc0 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
31cd0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
31ce0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  }..      if( rc!
31cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31d00 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
31d10 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66  anch is taken if
31d20 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
31d30 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
31d40 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
31d50 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   or roll back a 
31d60 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c  hot-journal whil
31d70 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  e holding an EXC
31d80 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
31d90 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
31da0 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69  r_unlock() routi
31db0 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
31dc0 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
31dd0 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20  ng to unlock.   
31de0 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65       ** the file
31df0 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20  . If the unlock 
31e00 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74  attempt fails, t
31e10 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  hen Pager.eLock 
31e20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20  must be.        
31e30 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  ** set to UNKNOW
31e40 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20  N_LOCK (see the 
31e50 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
31e60 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20  e #define for . 
31e70 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57         ** UNKNOW
31e80 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72  N_LOCK above for
31e90 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29   an explanation)
31ea0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
31eb0 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65        ** In orde
31ec0 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75  r to get pager_u
31ed0 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68  nlock() to do th
31ee0 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53  is, set Pager.eS
31ef0 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20  tate to.        
31f00 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e  ** PAGER_ERROR n
31f10 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  ow. This is not 
31f20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64  actually counted
31f30 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e   as a transition
31f40 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45  .        ** to E
31f50 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68  RROR state in th
31f60 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 20  e state diagram 
31f70 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
31f80 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20  is file,.       
31f90 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f   ** since we kno
31fa0 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  w that the same 
31fb0 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
31fc0 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79  lock() will very
31fd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72  .        ** shor
31fe0 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  tly transition t
31ff0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
32000 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74  to the OPEN stat
32010 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20  e. Calling.     
32020 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67     ** assert_pag
32030 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64  er_state() would
32040 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74   fail now, as it
32050 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70   should not be p
32060 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
32070 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f  ** to be in ERRO
32080 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 65  R state when the
32090 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73  re are zero outs
320a0 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20  tanding page .  
320b0 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e        ** referen
320c0 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ces..        */.
320d0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72          pager_er
320e0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
320f0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
32100 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  iled;.      }.. 
32110 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
32120 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32130 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20  ER_OPEN );.     
32140 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
32150 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ->eLock==SHARED_
32160 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20  LOCK).          
32170 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
32180 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
32190 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52  ager->eLock>SHAR
321a0 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29  ED_LOCK).      )
321b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
321c0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
321d0 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e 68 61  le && pPager->ha
321e0 73 42 65 65 6e 55 73 65 64 20 29 7b 0a 20 20 20  sBeenUsed ){.   
321f0 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
32200 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62  -lock has just b
32210 65 65 6e 20 61 63 71 75 69 72 65 64 20 74 68 65  een acquired the
32220 6e 20 63 68 65 63 6b 20 74 6f 0a 20 20 20 20 20  n check to.     
32230 20 2a 2a 20 73 65 65 20 69 66 20 74 68 65 20 64   ** see if the d
32240 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
32250 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
32260 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
32270 63 68 61 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a  changed,.      *
32280 2a 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  * flush the cach
32290 65 2e 20 20 54 68 65 20 70 50 61 67 65 72 2d 3e  e.  The pPager->
322a0 68 61 73 42 65 65 6e 55 73 65 64 20 66 6c 61 67  hasBeenUsed flag
322b0 20 70 72 65 76 65 6e 74 73 20 74 68 69 73 20 66   prevents this f
322c0 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  rom.      ** occ
322d0 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20 76 65  urring on the ve
322e0 72 79 20 66 69 72 73 74 20 61 63 63 65 73 73 20  ry first access 
322f0 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f 72  to a file, in or
32300 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a 20 20  der to save a.  
32310 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75 6e      ** single un
32320 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69 74 65  necessary sqlite
32330 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 20 61  3OsRead() call a
32340 74 20 74 68 65 20 73 74 61 72 74 2d 75 70 2e 0a  t the start-up..
32350 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
32360 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
32370 65 73 20 61 72 65 20 64 65 74 65 63 74 65 64 20  es are detected 
32380 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
32390 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
323a0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
323b0 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
323c0 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
323d0 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
323e0 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
323f0 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
32400 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
32410 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
32420 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
32430 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
32440 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
32450 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
32460 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
32470 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
32480 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
32490 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
324a0 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
324b0 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
324c0 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
324d0 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
324e0 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
324f0 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
32500 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
32510 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
32520 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
32530 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
32540 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
32550 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b   Pgno nPage = 0;
32560 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
32570 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
32580 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
32590 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  )];..      rc = 
325a0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
325b0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
325c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
325d0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20  oto failed;..   
325e0 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29     if( nPage>0 )
325f0 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
32600 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
32610 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
32620 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
32630 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
32640 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
32650 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
32660 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
32670 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
32680 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
32690 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
326a0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
326b0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
326c0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
326d0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
326e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
326f0 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
32700 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
32710 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
32720 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
32730 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
32740 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
32750 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
32760 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
32770 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
32780 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20  eset(pPager);.. 
32790 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20         /* Unmap 
327a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
327b0 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  e. It is possibl
327c0 65 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20  e that external 
327d0 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20  processes.      
327e0 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72    ** may have tr
327f0 75 6e 63 61 74 65 64 20 74 68 65 20 64 61 74 61  uncated the data
32800 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
32810 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20 62  en extended it b
32820 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ack.        ** t
32830 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
32840 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20 70  ize while this p
32850 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68  rocess was not h
32860 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20  olding a lock.. 
32870 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69         ** In thi
32880 73 20 63 61 73 65 20 74 68 65 72 65 20 6d 61 79  s case there may
32890 20 65 78 69 73 74 20 61 20 50 61 67 65 72 2e 70   exist a Pager.p
328a0 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74  Map mapping that
328b0 20 61 70 70 65 61 72 73 0a 20 20 20 20 20 20 20   appears.       
328c0 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69   ** to be the ri
328d0 67 68 74 20 73 69 7a 65 20 62 75 74 20 69 73 20  ght size but is 
328e0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c  not actually val
328f0 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20  id. Avoid this. 
32900 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62         ** possib
32910 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69  ility by unmappi
32920 6e 67 20 74 68 65 20 64 62 20 68 65 72 65 2e 20  ng the db here. 
32930 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 55  */.        if( U
32940 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
32950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
32960 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
32970 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
32980 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32990 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
329a0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57   If there is a W
329b0 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  AL file in the f
329c0 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e  ile-system, open
329d0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
329e0 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64  n WAL.    ** mod
329f0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  e. Otherwise, th
32a00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
32a10 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e  tion call is a n
32a20 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o-op..    */.   
32a30 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57   rc = pagerOpenW
32a40 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67  alIfPresent(pPag
32a50 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  er);.#ifndef SQL
32a60 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
32a70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32a80 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d  >pWal==0 || rc==
32a90 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e  SQLITE_OK );.#en
32aa0 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
32ab0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
32ac0 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
32ad0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32ae0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
32af0 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
32b00 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
32b10 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
32b20 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32b30 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49  OPEN && rc==SQLI
32b40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
32b50 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
32b60 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
32b70 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
32b80 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72   failed:.  if( r
32b90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32ba0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
32bb0 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
32bc0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
32bd0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32be0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32bf0 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73  R_OPEN );.  }els
32c00 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e{.    pPager->e
32c10 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
32c20 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ADER;.  }.  retu
32c30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
32c40 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  If the reference
32c50 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68   count has reach
32c60 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63  ed zero, rollbac
32c70 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20  k any active.** 
32c80 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
32c90 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
32ca0 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
32cb0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
32cc0 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74  EXCLUSIVE when t
32cd0 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
32ce0 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c  to in.** the rol
32cf0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74  lback journal, t
32d00 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74  he unlock is not
32d10 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74   performed and t
32d20 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69  here is.** nothi
32d30 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  ng to rollback, 
32d40 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
32d50 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a  is a no-op..*/ .
32d60 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
32d70 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
32d80 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32d90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d    if( pPager->nM
32da0 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73 71  mapOut==0 && (sq
32db0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
32dc0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
32dd0 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  che)==0) ){.    
32de0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
32df0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
32e00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71    }.}../*.** Acq
32e10 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65  uire a reference
32e20 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
32e30 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50  pgno in pager pP
32e40 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20  ager (a page.** 
32e50 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79  reference has ty
32e60 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20  pe DbPage*). If 
32e70 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
32e80 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73  ference is .** s
32e90 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61  uccessfully obta
32ea0 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69  ined, it is copi
32eb0 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e  ed to *ppPage an
32ec0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
32ed0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
32ee0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
32ef0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
32f00 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73  the cache, it is
32f10 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
32f20 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20  therwise, a new 
32f30 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61  page object is a
32f40 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70  llocated and pop
32f50 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ulated with data
32f60 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68  .** read from th
32f70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
32f80 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20   In some cases, 
32f90 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
32fa0 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20  e may.** choose 
32fb0 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  not to allocate 
32fc0 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
32fd0 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20  t and may reuse 
32fe0 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f  an existing.** o
32ff0 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75  bject with no ou
33000 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
33010 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nces..**.** The 
33020 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
33030 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
33040 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
33050 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  zed to zeros the
33060 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20   .** first time 
33070 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
33080 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66   into memory. If
33090 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73   the page reques
330a0 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61  ted is .** alrea
330b0 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  dy in the cache 
330c0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
330d0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
330e0 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20  en the extra.** 
330f0 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20  data is left as 
33100 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  it was when the 
33110 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20  page object was 
33120 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  last used..**.**
33130 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
33140 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65   image is smalle
33150 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
33160 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20  sted page or if 
33170 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76  a .** non-zero v
33180 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61  alue is passed a
33190 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  s the noContent 
331a0 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68  parameter and th
331b0 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
331c0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
331d0 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ady stored in th
331e0 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f  e cache, then no
331f0 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b   .** actual disk
33200 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e   read occurs. In
33210 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d   this case the m
33220 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
33230 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69  he .** page is i
33240 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
33250 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20  l zeros. .**.** 
33260 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
33270 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  true, it means t
33280 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
33290 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  re about the con
332a0 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tents.** of the 
332b0 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72  page. This occur
332c0 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  s in two scenari
332d0 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
332e0 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
332f0 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
33300 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
33310 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
33320 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
33330 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
33340 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
33350 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
33360 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
33370 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
33380 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
33390 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
333a0 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
333b0 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
333c0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  al..**.** If noC
333d0 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
333e0 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65  then the data re
333f0 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64  turned is zeroed
33400 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
33410 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74  eing read from t
33420 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
33430 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62  itionally, the b
33440 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  its correspondin
33450 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20  g.** to pgno in 
33460 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
33470 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65   (bitvec of page
33480 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65  s already writte
33490 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  n to the.** jour
334a0 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
334b0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
334c0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
334d0 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65  tvecs of any ope
334e0 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20  n.** savepoints 
334f0 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65  are set. This me
33500 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20  ans if the page 
33510 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
33520 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74   at any.** point
33530 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
33540 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
33550 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
33560 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74  e(), its content
33570 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s.** will not be
33580 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73   journaled. This
33590 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a   saves IO..**.**
335a0 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
335b0 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
335c0 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
335d0 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
335e0 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
335f0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
33600 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
33610 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
33620 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
33630 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
33640 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
33650 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
33660 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
33670 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
33680 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
33690 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
336a0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
336b0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
336c0 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
336d0 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
336e0 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
336f0 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
33700 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
33710 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
33720 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
33730 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
33740 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
33750 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
33760 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
33770 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
33780 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
33790 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
337a0 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
337b0 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
337c0 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
337d0 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
337e0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
337f0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
33800 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
33810 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
33820 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
33830 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
33840 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
33850 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
33860 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
33870 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
33880 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
33890 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
338a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
338b0 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
338c0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
338d0 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
338e0 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  XXX flags */.){.
338f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33900 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70  E_OK;.  PgHdr *p
33910 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46  Pg = 0;.  u32 iF
33920 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rame = 0;       
33930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61            /* Fra
33940 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  me to read from 
33950 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  WAL file */.  co
33960 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  nst int noConten
33970 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  t = (flags & PAG
33980 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
33990 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61  );..  /* It is a
339a0 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65  cceptable to use
339b0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
339c0 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79  ap) page for any
339d0 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a   page except.  *
339e0 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72  * page 1 if ther
339f0 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  e is no write-tr
33a00 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
33a10 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45  r the ACQUIRE_RE
33a20 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67  ADONLY.  ** flag
33a30 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62   was specified b
33a40 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e  y the caller. An
33a50 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65  d so long as the
33a60 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20   db is not a .  
33a70 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20  ** temporary or 
33a80 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
33a90 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  se.  */.  const 
33aa0 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70  int bMmapOk = (p
33ab0 67 6e 6f 21 3d 31 20 26 26 20 55 53 45 46 45 54  gno!=1 && USEFET
33ac0 43 48 28 70 50 61 67 65 72 29 0a 20 20 20 26 26  CH(pPager).   &&
33ad0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
33ae0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c  ==PAGER_READER |
33af0 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  | (flags & PAGER
33b00 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a  _GET_READONLY)).
33b10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
33b20 53 5f 43 4f 44 45 43 0a 20 20 20 26 26 20 70 50  S_CODEC.   && pP
33b30 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a  ager->xCodec==0.
33b40 23 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20 61  #endif.  );..  a
33b50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
33b60 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
33b70 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
33b80 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
33b90 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
33ba0 20 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65   assert( noConte
33bb0 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b  nt==0 || bMmapOk
33bc0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  ==0 );..  if( pg
33bd0 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
33be0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
33bf0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70  PT_BKPT;.  }.  p
33c00 50 61 67 65 72 2d 3e 68 61 73 42 65 65 6e 55 73  Pager->hasBeenUs
33c10 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  ed = 1;..  /* If
33c20 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
33c30 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
33c40 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
33c50 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a  r immediately. .
33c60 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
33c70 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65  request the page
33c80 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65   from the PCache
33c90 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28   layer. */.  if(
33ca0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
33cb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33cc0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
33cd0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
33ce0 7b 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f  {.    if( bMmapO
33cf0 6b 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  k && pagerUseWal
33d00 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
33d10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
33d20 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
33d30 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
33d40 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
33d50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33d60 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
33d70 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
33d80 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f  ..    if( bMmapO
33d90 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d 30 20 29  k && iFrame==0 )
33da0 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
33db0 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  ata = 0;..      
33dc0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65  rc = sqlite3OsFe
33dd0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
33de0 0a 20 20 20 20 20 20 20 20 20 20 28 69 36 34 29  .          (i64)
33df0 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
33e00 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
33e10 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26  ger->pageSize, &
33e20 70 44 61 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a  pData.      );..
33e30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33e40 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61  LITE_OK && pData
33e50 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
33e60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
33e70 41 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a 20  AGER_READER ){. 
33e80 20 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 73           pPg = s
33e90 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
33ea0 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
33eb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33ec0 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
33ed0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
33ee0 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
33ef0 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  age(pPager, pgno
33f00 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a  , pData, &pPg);.
33f10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
33f20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33f30 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
33f40 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
33f50 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
33f60 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
33f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33f80 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
33f90 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
33fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
33fb0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
33fc0 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 20  = pPg;.         
33fd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
33fe0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
33ff0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
34000 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34010 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
34020 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34030 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
34040 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74     {.      sqlit
34050 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
34060 70 42 61 73 65 3b 0a 20 20 20 20 20 20 70 42 61  pBase;.      pBa
34070 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  se = sqlite3Pcac
34080 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
34090 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33  pPCache, pgno, 3
340a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 61  );.      if( pBa
340b0 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  se==0 ){.       
340c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
340d0 63 68 65 46 65 74 63 68 53 74 72 65 73 73 28 70  cheFetchStress(p
340e0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
340f0 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20  pgno, &pBase);. 
34100 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
34110 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
34120 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34130 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
34140 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d   pPg = *ppPage =
34150 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34160 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72  tchFinish(pPager
34170 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
34180 20 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20 69   pBase);.      i
34190 66 28 20 70 50 67 3d 3d 30 20 29 20 72 63 20 3d  f( pPg==0 ) rc =
341a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
341b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
341c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
341d0 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
341e0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
341f0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
34200 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
34210 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
34220 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64  pager was alread
34230 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  y in the error-s
34240 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
34250 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
34260 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70  ed..    ** Set p
34270 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70  Pg to 0 and jump
34280 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f   to the exceptio
34290 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20  n handler.  */. 
342a0 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
342b0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
342c0 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73  re_err;.  }.  as
342d0 73 65 72 74 28 20 70 50 67 3d 3d 28 2a 70 70 50  sert( pPg==(*ppP
342e0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
342f0 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  ( pPg->pgno==pgn
34300 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
34310 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
34320 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  er || pPg->pPage
34330 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  r==0 );..  if( p
34340 50 67 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e  Pg->pPager && !n
34350 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
34360 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
34370 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61  the pcache alrea
34380 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  dy contains an i
34390 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20  nitialized copy 
343a0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  of.    ** the pa
343b0 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  ge. Return witho
343c0 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20  ut further ado. 
343d0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
343e0 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f  pgno<=PAGER_MAX_
343f0 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41  PGNO && pgno!=PA
34400 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
34410 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  er) );.    pPage
34420 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
34430 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20  TAT_HIT]++;.    
34440 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34450 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
34460 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63  /* The pager cac
34470 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61  he has created a
34480 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63   new page. Its c
34490 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  ontent needs to 
344a0 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69  .    ** be initi
344b0 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20  alized.  */..   
344c0 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
344d0 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54  Pager;..    /* T
344e0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
344f0 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
34500 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
34510 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
34520 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72      ** number gr
34530 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
34540 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c   or the unused l
34550 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20  ocking-page, is 
34560 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20  requested. */.  
34570 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
34580 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
34590 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
345a0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
345b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
345c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
345d0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
345e0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
345f0 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c  .    if( MEMDB |
34600 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
34610 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65  <pgno || noConte
34620 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50  nt || !isOpen(pP
34630 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
34640 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
34650 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
34660 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34670 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  E_FULL;.        
34680 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34690 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
346a0 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74        if( noCont
346b0 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ent ){.        /
346c0 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74  * Failure to set
346d0 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
346e0 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76   InJournal bit-v
346f0 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e  ectors is benign
34700 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20  ..        ** It 
34710 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61  merely means tha
34720 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f  t we might do so
34730 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f  me extra work to
34740 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20   journal a .    
34750 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74      ** page that
34760 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
34770 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  o be journaled. 
34780 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62   Nevertheless, b
34790 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20  e sure .        
347a0 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63  ** to test the c
347b0 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c  ase where a mall
347c0 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
347d0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
347e0 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  set .        ** 
347f0 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76  a bit in a bit v
34800 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a  ector..        *
34810 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
34820 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
34830 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oc();.        if
34840 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
34850 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
34860 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
34870 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33  ( rc = ) sqlite3
34880 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
34890 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
348a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  no);.          t
348b0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
348c0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
348d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
348e0 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
348f0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
34900 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67  tvecs(pPager, pg
34910 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
34920 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
34930 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
34940 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
34950 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
34960 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
34970 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
34980 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
34990 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  e);.      IOTRAC
349a0 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
349b0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
349c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
349d0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
349e0 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 62  Wal(pPager) && b
349f0 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20  MmapOk==0 ){.   
34a00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34a10 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
34a20 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f  ager->pWal, pgno
34a30 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
34a40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34a50 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
34a60 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
34a80 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
34a90 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
34aa0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
34ab0 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53  [PAGER_STAT_MISS
34ac0 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ]++;.      rc = 
34ad0 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20  readDbPage(pPg, 
34ae0 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
34af0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34b00 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
34b10 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34b20 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
34b30 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
34b40 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20  pagehash(pPg);. 
34b50 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
34b60 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61  ITE_OK;..pager_a
34b70 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73  cquire_err:.  as
34b80 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
34b90 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67  _OK );.  if( pPg
34ba0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
34bb0 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
34bc0 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
34bd0 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
34be0 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  );..  *ppPage = 
34bf0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
34c00 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
34c10 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
34c20 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
34c30 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
34c40 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
34c50 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
34c60 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
34c70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
34c80 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
34c90 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
34ca0 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20  n cache. .**.** 
34cb0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
34cc0 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
34cd0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
34ce0 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
34cf0 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
34d00 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
34d10 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
34d20 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
34d30 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
34d40 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
34d50 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
34d60 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
34d70 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
34d80 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
34d90 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
34da0 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
34db0 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
34dc0 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
34dd0 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
34de0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
34df0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
34e00 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c  gno pgno){.  sql
34e10 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65  ite3_pcache_page
34e20 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
34e30 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
34e40 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
34e50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
34e60 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
34e70 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 73  0 );.  pPage = s
34e80 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
34e90 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
34ea0 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61  e, pgno, 0);.  a
34eb0 73 73 65 72 74 28 20 70 50 61 67 65 3d 3d 30 20  ssert( pPage==0 
34ec0 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61 73 42 65  || pPager->hasBe
34ed0 65 6e 55 73 65 64 20 29 3b 0a 20 20 72 65 74 75  enUsed );.  retu
34ee0 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
34ef0 46 65 74 63 68 46 69 6e 69 73 68 28 70 50 61 67  FetchFinish(pPag
34f00 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
34f10 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  o, pPage);.}../*
34f20 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
34f30 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a  ge reference..**
34f40 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
34f50 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
34f60 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
34f70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
34f80 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
34f90 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
34fa0 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
34fb0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
34fc0 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
34fd0 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
34fe0 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
34ff0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
35000 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
35010 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oved..*/.void sq
35020 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
35030 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a 70  otNull(DbPage *p
35040 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
35050 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
35060 70 50 67 21 3d 30 20 29 3b 0a 20 20 70 50 61 67  pPg!=0 );.  pPag
35070 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
35080 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61  ;.  if( pPg->fla
35090 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20  gs & PGHDR_MMAP 
350a0 29 7b 0a 20 20 20 20 70 61 67 65 72 52 65 6c 65  ){.    pagerRele
350b0 61 73 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b  aseMapPage(pPg);
350c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
350d0 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
350e0 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  se(pPg);.  }.  p
350f0 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
35100 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f  ed(pPager);.}.vo
35110 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
35120 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
35130 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 20 73  ){.  if( pPg ) s
35140 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
35150 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a  NotNull(pPg);.}.
35160 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
35170 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
35180 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
35190 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73  very write trans
351a0 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65  action..** There
351b0 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65   must already be
351c0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
351d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
351e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
351f0 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  * file when this
35200 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
35210 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ed..**.** Open t
35220 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35230 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
35240 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75   and write a jou
35250 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74  rnal header.** t
35260 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
35270 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  t. If there are 
35280 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
35290 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d  s, open the sub-
352a0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65  journal.** as we
352b0 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
352c0 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77  n is only used w
352d0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
352e0 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a  file is being .*
352f0 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74  * opened to writ
35300 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67  e a rollback log
35310 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
35320 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73  on. It is not us
35330 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e  ed .** when open
35340 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ing a hot journa
35350 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69  l file to roll i
35360 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
35370 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35380 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
35390 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  n (as it may be 
353a0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
353b0 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  e),.** then this
353c0 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77   function just w
353d0 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20  rites a journal 
353e0 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74  header to the st
353f0 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c  art of the.** al
35400 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e  ready open file.
35410 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20   .**.** Whether 
35420 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
35430 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
35440 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
35450 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  on, the.** Pager
35460 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
35470 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ec structure is 
35480 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
35490 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
354a0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
354b0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f  is successful. O
354c0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
354d0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
354e0 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  M if the attempt
354f0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67   to allocate Pag
35500 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61  er.pInJournal fa
35510 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49  ils, or .** an I
35520 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
35530 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69  opening or writi
35540 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
35550 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ile fails..*/.st
35560 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
35570 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
35580 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
35590 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
355a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
355b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
355c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
355d0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
355e0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
355f0 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c  pVfs;   /* Local
35600 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f   cache of vfs po
35610 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  inter */..  asse
35620 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
35630 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
35640 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73  _LOCKED );.  ass
35650 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
35660 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
35670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
35680 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
35690 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =0 );.  .  /* If
356a0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
356b0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69  error state, thi
356c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
356d0 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20  no-op.  But on. 
356e0 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61   ** the other ha
356f0 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nd, this routine
35700 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
35710 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
35720 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72  dy in.  ** an er
35730 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ror state. */.  
35740 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
35750 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
35760 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
35770 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67  ode;..  if( !pag
35780 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
35790 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
357a0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
357b0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
357c0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  {.    pPager->pI
357d0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
357e0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
357f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
35800 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
35810 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
35820 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
35830 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
35840 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  }.  .    /* Open
35850 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35860 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
35870 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
35880 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
35890 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
358a0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
358b0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
358c0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
358d0 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
358e0 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
358f0 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
35900 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >jfd);.      }el
35910 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  se{.        cons
35920 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20  t int flags =   
35930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35940 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20  /* VFS flags to 
35950 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
35960 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53  e */.          S
35970 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
35980 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
35990 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
359a0 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70     (pPager->temp
359b0 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20  File ? .        
359c0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
359d0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
359e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
359f0 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
35a00 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
35a10 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
35a20 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20  .          );.. 
35a30 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
35a40 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
35a50 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65  se still has the
35a60 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 69 74   same name as it
35a70 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20 20 20   did when.      
35a80 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72 69 67    ** it was orig
35a90 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a  inally opened. *
35aa0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 64  /.        rc = d
35ab0 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64  atabaseIsUnmoved
35ac0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
35ad0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35ae0 5f 4f 4b 20 29 7b 0a 23 69 66 64 65 66 20 53 51  _OK ){.#ifdef SQ
35af0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
35b00 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
35b10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
35b20 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
35b30 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
35b40 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
35b50 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
35b60 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
35b70 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
35b80 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a         );.#else.
35b90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
35ba0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
35bb0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
35bc0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
35bd0 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e  , flags, 0);.#en
35be0 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
35bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
35c00 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
35c10 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
35c20 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
35c30 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57  }.  .  .    /* W
35c40 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
35c50 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
35c60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35c70 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20  e and open .    
35c80 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
35c90 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
35ca0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
35cb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35cc0 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
35cd0 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
35ce0 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
35cf0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
35d00 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
35d10 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
35d20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
35d30 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
35d40 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
35d50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
35d60 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
35d70 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
35d80 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
35d90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
35da0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35db0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
35dc0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
35dd0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
35de0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
35df0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
35e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
35e10 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
35e20 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
35e30 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70  _LOCKED );.    p
35e40 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
35e50 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
35e60 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  HEMOD;.  }..  re
35e70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
35e80 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
35e90 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
35ea0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
35eb0 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
35ec0 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
35ed0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
35ee0 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
35ef0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
35f00 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
35f10 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
35f20 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
35f30 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
35f40 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
35f50 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
35f60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
35f70 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
35f80 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
35f90 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
35fa0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
35fb0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
35fc0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
35fd0 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
35fe0 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
35ff0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
36000 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
36010 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
36020 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
36030 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
36040 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
36050 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
36060 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
36070 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
36080 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
36090 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
360a0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
360b0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
360c0 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
360d0 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
360e0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
360f0 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
36100 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
36110 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
36120 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
36130 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
36140 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
36150 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
36160 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
36170 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
36180 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
36190 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
361a0 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
361b0 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
361c0 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
361d0 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
361e0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
361f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
36200 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
36210 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
36220 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
36230 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
36240 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
36250 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
36260 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
36270 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
36280 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61  ER_READER && pPa
36290 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
362a0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61  R_ERROR );.  pPa
362b0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
362c0 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
362d0 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57  mory;..  if( ALW
362e0 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61  AYS(pPager->eSta
362f0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
36300 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
36310 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
36320 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69  nal==0 );..    i
36330 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
36340 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
36350 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
36360 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
36370 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64   use locking_mod
36380 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64  e=exclusive, and
36390 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63   an.      ** exc
363a0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
363b0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
363c0 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ot already held,
363d0 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a   obtain it now..
363e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
363f0 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
36400 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69  siveMode && sqli
36410 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
36420 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
36430 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  , -1) ){.       
36440 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
36450 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
36460 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
36470 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36480 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36490 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
364a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
364b0 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
364c0 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
364d0 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Wal, 1);.      }
364e0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20  ..      /* Grab 
364f0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
36500 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
36510 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75  If successful, u
36520 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20  pgrade to.      
36530 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
36540 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  D state. Otherwi
36550 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  se, return an er
36560 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
36570 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a  caller..      **
36580 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   The busy-handle
36590 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64  r is not invoked
365a0 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   if another conn
365b0 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20  ection already. 
365c0 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68       ** holds th
365d0 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66  e write-lock. If
365e0 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75   possible, the u
365f0 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
36600 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a  call it..      *
36610 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
36620 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74  ite3WalBeginWrit
36630 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
36640 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
36650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
36660 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  Obtain a RESERVE
36670 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
36680 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
36690 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d  the exFlag param
366a0 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  eter.      ** is
366b0 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65   true, then imme
366c0 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20  diately upgrade 
366d0 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55  this to an EXCLU
366e0 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
366f0 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e       ** busy-han
36700 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61  dler callback ca
36710 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75  n be used when u
36720 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20  pgrading to the 
36730 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20  EXCLUSIVE.      
36740 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74  ** lock, but not
36750 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20   when obtaining 
36760 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
36770 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
36780 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
36790 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
367a0 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
367b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
367c0 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a  OK && exFlag ){.
367d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
367e0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
367f0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
36800 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  E_LOCK);.      }
36810 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
36820 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36830 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65  .      /* Change
36840 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   to WRITER_LOCKE
36850 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  D state..      *
36860 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d  *.      ** WAL m
36870 6f 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65  ode sets Pager.e
36880 53 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57  State to PAGER_W
36890 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20  RITER_LOCKED or 
368a0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a  CACHEMOD.      *
368b0 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e  * when it has an
368c0 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f   open transactio
368d0 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20  n, but never to 
368e0 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45  DBMOD or FINISHE
368f0 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  D..      ** This
36900 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74   is because in t
36910 68 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20  hose states the 
36920 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63  code to roll bac
36930 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  k savepoint .   
36940 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
36950 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61  ns may copy data
36960 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
36970 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64  urnal into the d
36980 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a  atabase .      *
36990 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61  * file as well a
369a0 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20  s into the page 
369b0 63 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75  cache. Which wou
369c0 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20  ld be incorrect 
369d0 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c  in .      ** WAL
369e0 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   mode..      */.
369f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
36a00 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
36a10 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  TER_LOCKED;.    
36a20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
36a30 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
36a40 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
36a50 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
36a60 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
36a70 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
36a80 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61  dbOrigSize = pPa
36a90 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
36aa0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
36ab0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
36ac0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ..    assert( rc
36ad0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
36ae0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
36af0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
36b00 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
36b10 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
36b20 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36b30 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
36b40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
36b50 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
36b60 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d  e(pPager) );.  }
36b70 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
36b80 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
36b90 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
36ba0 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  er)));.  return 
36bb0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
36bc0 74 65 20 70 61 67 65 20 70 50 67 20 6f 6e 74 6f  te page pPg onto
36bd0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
36be0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
36bf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
36c00 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
36c10 70 61 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f  pagerAddPageToRo
36c20 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 50 67  llbackJournal(Pg
36c30 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
36c40 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
36c50 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
36c60 72 63 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  rc;.  u32 cksum;
36c70 0a 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b  .  char *pData2;
36c80 0a 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50  .  i64 iOff = pP
36c90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
36ca0 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c  ;..  /* We shoul
36cb0 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
36cc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36cd0 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
36ce0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
36cf0 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
36d00 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
36d10 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
36d20 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f  .  ** that we do
36d30 20 6e 6f 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72   not. */.  asser
36d40 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
36d50 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
36d60 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
36d70 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
36d80 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  lHdr<=pPager->jo
36d90 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 43 4f  urnalOff );.  CO
36da0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67  DEC2(pPager, pPg
36db0 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  ->pData, pPg->pg
36dc0 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
36dd0 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
36de0 61 32 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20 70  a2);.  cksum = p
36df0 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
36e00 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
36e10 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61  ..  /* Even if a
36e20 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
36e30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
36e40 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  ile journalling 
36e50 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  the.  ** page in
36e60 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
36e70 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73  , set the need-s
36e80 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65  ync flag for the
36e90 20 70 61 67 65 2e 0a 20 20 2a 2a 20 4f 74 68 65   page..  ** Othe
36ea0 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20  rwise, when the 
36eb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
36ec0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
36ed0 6c 6f 67 69 63 20 69 6e 0a 20 20 2a 2a 20 70 6c  logic in.  ** pl
36ee0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
36ef0 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61  ) will think tha
36f00 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
36f10 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a   to be restored.
36f20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
36f30 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69  base file. And i
36f40 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
36f50 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67  curs while doing
36f60 20 73 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63   so,.  ** then c
36f70 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f  orruption may fo
36f80 6c 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  llow..  */.  pPg
36f90 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
36fa0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 72  _NEED_SYNC;..  r
36fb0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
36fc0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66  pPager->jfd, iOf
36fd0 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  f, pPg->pgno);. 
36fe0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36ff0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37000 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
37010 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
37020 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
37030 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66  r->pageSize, iOf
37040 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  f+4);.  if( rc!=
37050 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
37060 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 77 72  rn rc;.  rc = wr
37070 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
37080 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67  ->jfd, iOff+pPag
37090 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
370a0 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63  cksum);.  if( rc
370b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
370c0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 49 4f 54 52  turn rc;..  IOTR
370d0 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
370e0 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
370f0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
37100 0a 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67  .           pPag
37110 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
37120 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
37130 29 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  ));.  PAGER_INCR
37140 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
37150 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
37160 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55  PAGERTRACE(("JOU
37170 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
37180 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
37190 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
371a0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
371b0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  ), pPg->pgno, . 
371c0 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
371d0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
371e0 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f  NC)?1:0), pager_
371f0 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
37200 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
37210 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50  nalOff += 8 + pP
37220 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
37230 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
37240 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
37250 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
37260 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
37270 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
37280 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
37290 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74   pPg->pgno);.  t
372a0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
372b0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 61  ITE_NOMEM );.  a
372c0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
372d0 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
372e0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 63  TE_NOMEM );.  rc
372f0 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69   |= addToSavepoi
37300 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
37310 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
37320 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
37330 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
37340 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
37350 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37360 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65  ** Mark a single
37370 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
37380 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67  iteable. The pag
37390 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
373a0 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a  o the .** main j
373b0 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
373c0 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65  urnal as require
373d0 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  d. If the page i
373e0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  s written into.*
373f0 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * one of the jou
37400 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65  rnals, the corre
37410 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
37420 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50  set in the .** P
37430 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
37440 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50  bitvec and the P
37450 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
37460 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
37470 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65  cs.** of any ope
37480 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20  n savepoints as 
37490 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
374a0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
374b0 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
374c0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
374d0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
374e0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
374f0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54  LITE_OK;..  /* T
37500 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
37510 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73  ot called unless
37520 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
37530 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
37540 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72   .  ** been star
37550 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ted. The journal
37560 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79   file may or may
37570 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20   not be open at 
37580 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
37590 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c   It is never cal
375a0 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52  led in the ERROR
375b0 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61   state..  */.  a
375c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
375d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
375e0 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20  TER_LOCKED.     
375f0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
37600 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37610 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
37620 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
37630 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37640 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
37650 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
37660 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
37670 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
37680 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
37690 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
376a0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d  Pager->readOnly=
376b0 3d 30 20 29 3b 0a 20 20 43 48 45 43 4b 5f 50 41  =0 );.  CHECK_PA
376c0 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54  GE(pPg);..  /* T
376d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
376e0 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e  needs to be open
376f0 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c  ed. Higher level
37700 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61   routines have a
37710 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61  lready.  ** obta
37720 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61  ined the necessa
37730 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69  ry locks to begi
37740 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  n the write-tran
37750 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65  saction, but the
37760 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  .  ** rollback j
37770 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
37780 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70   yet be open. Op
37790 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69  en it now if thi
377a0 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  s is the case.. 
377b0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
377c0 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c   done before cal
377d0 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  ling sqlite3Pcac
377e0 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e  heMakeDirty() on
377f0 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a   the page. .  **
37800 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69   Otherwise, if i
37810 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65  t were done afte
37820 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  r calling sqlite
37830 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
37840 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e  (), then.  ** an
37850 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63   error might occ
37860 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  ur and the pager
37870 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e   would end up in
37880 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
37890 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70  tate.  ** with p
378a0 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64  ages marked as d
378b0 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68  irty in the cach
378c0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
378d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
378e0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
378f0 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  D ){.    rc = pa
37900 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
37910 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
37920 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37930 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
37940 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37950 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
37960 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
37970 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
37980 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
37990 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
379a0 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
379b0 74 68 61 74 20 69 73 20 61 62 6f 75 74 20 74 6f  that is about to
379c0 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20   be modified as 
379d0 64 69 72 74 79 2e 20 2a 2f 0a 20 20 73 71 6c 69  dirty. */.  sqli
379e0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
379f0 74 79 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  ty(pPg);..  /* I
37a00 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  f a rollback jou
37a10 72 6e 61 6c 20 69 73 20 69 6e 20 75 73 65 2c 20  rnal is in use, 
37a20 74 68 65 6d 20 6d 61 6b 65 20 73 75 72 65 20 74  them make sure t
37a30 68 65 20 70 61 67 65 20 74 68 61 74 20 69 73 20  he page that is 
37a40 61 62 6f 75 74 0a 20 20 2a 2a 20 74 6f 20 63 68  about.  ** to ch
37a50 61 6e 67 65 20 69 73 20 69 6e 20 74 68 65 20 72  ange is in the r
37a60 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
37a70 20 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 20   or if the page 
37a80 69 73 20 61 20 6e 65 77 20 70 61 67 65 20 6f 66  is a new page of
37a90 66 0a 20 20 2a 2a 20 74 68 65 6e 20 65 6e 64 20  f.  ** then end 
37aa0 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 6d 61 6b  of the file, mak
37ab0 65 20 73 75 72 65 20 69 74 20 69 73 20 6d 61 72  e sure it is mar
37ac0 6b 65 64 20 61 73 20 50 47 48 44 52 5f 4e 45 45  ked as PGHDR_NEE
37ad0 44 5f 53 59 4e 43 2e 0a 20 20 2a 2f 0a 20 20 61  D_SYNC..  */.  a
37ae0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
37af0 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 29 20 3d  pInJournal!=0) =
37b00 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
37b10 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70  >jfd) );.  if( p
37b20 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
37b30 6c 21 3d 30 0a 20 20 20 26 26 20 73 71 6c 69 74  l!=0.   && sqlit
37b40 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e  e3BitvecTestNotN
37b50 75 6c 6c 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ull(pPager->pInJ
37b60 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
37b70 6f 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 61  o)==0.  ){.    a
37b80 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
37b90 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
37ba0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
37bb0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
37bc0 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
37bd0 72 63 20 3d 20 70 61 67 65 72 41 64 64 50 61 67  rc = pagerAddPag
37be0 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e  eToRollbackJourn
37bf0 61 6c 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  al(pPg);.      i
37c00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37c10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
37c20 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
37c30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37c40 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
37c50 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te!=PAGER_WRITER
37c60 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20  _DBMOD ){.      
37c70 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
37c80 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
37c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50  .      }.      P
37ca0 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45  AGERTRACE(("APPE
37cb0 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
37cc0 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
37cd0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
37ce0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
37cf0 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
37d00 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
37d10 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
37d20 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 7d  C)?1:0)));.    }
37d30 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
37d40 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
37d50 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
37d60 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
37d70 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68  t in it,.  ** th
37d80 65 6e 20 77 72 69 74 65 20 74 68 65 20 70 61 67  en write the pag
37d90 65 20 69 6e 74 6f 20 74 68 65 20 73 74 61 74 65  e into the state
37da0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
37db0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
37dc0 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 26 26  >nSavepoint>0 &&
37dd0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
37de0 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72 63  e(pPg) ){.    rc
37df0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
37e00 65 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  e(pPg);.  }..  /
37e10 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
37e20 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
37e30 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  eturn. */.  if( 
37e40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
37e50 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
37e60 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
37e70 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a   pPg->pgno;.  }.
37e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
37e90 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
37ea0 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c 69 74  variant of sqlit
37eb0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 74  e3PagerWrite() t
37ec0 68 61 74 20 72 75 6e 73 20 77 68 65 6e 20 74 68  hat runs when th
37ed0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 2a 2a  e sector size.**
37ee0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
37ef0 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20  the page size.  
37f00 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 74 68 65  SQLite makes the
37f10 20 28 72 65 61 73 6f 6e 61 62 6c 65 29 20 61 73   (reasonable) as
37f20 73 75 6d 70 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  sumption that.**
37f30 20 61 6c 6c 20 62 79 74 65 73 20 6f 66 20 61 20   all bytes of a 
37f40 73 65 63 74 6f 72 20 61 72 65 20 77 72 69 74 74  sector are writt
37f50 65 6e 20 74 6f 67 65 74 68 65 72 20 62 79 20 68  en together by h
37f60 61 72 64 77 61 72 65 2e 20 20 48 65 6e 63 65 2c  ardware.  Hence,
37f70 20 61 6c 6c 20 62 79 74 65 73 20 6f 66 0a 2a 2a   all bytes of.**
37f80 20 61 20 73 65 63 74 6f 72 20 6e 65 65 64 20 74   a sector need t
37f90 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  o be journalled 
37fa0 69 6e 20 63 61 73 65 20 6f 66 20 61 20 70 6f 77  in case of a pow
37fb0 65 72 20 6c 6f 73 73 20 69 6e 20 74 68 65 20 6d  er loss in the m
37fc0 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 61 20 77 72  iddle of.** a wr
37fd0 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c  ite..**.** Usual
37fe0 6c 79 2c 20 74 68 65 20 73 65 63 74 6f 72 20 73  ly, the sector s
37ff0 69 7a 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ize is less than
38000 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
38010 20 70 61 67 65 20 73 69 7a 65 2c 20 69 6e 20 77   page size, in w
38020 68 69 63 68 0a 2a 2a 20 63 61 73 65 20 70 61 67  hich.** case pag
38030 65 73 20 63 61 6e 20 62 65 20 69 6e 64 69 76 69  es can be indivi
38040 64 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 2e 20  dually written. 
38050 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   This routine on
38060 6c 79 20 72 75 6e 73 20 69 6e 20 74 68 65 0a 2a  ly runs in the.*
38070 2a 20 65 78 63 65 70 74 69 6f 6e 61 6c 20 63 61  * exceptional ca
38080 73 65 20 77 68 65 72 65 20 74 68 65 20 70 61 67  se where the pag
38090 65 20 73 69 7a 65 20 69 73 20 73 6d 61 6c 6c 65  e size is smalle
380a0 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 74 6f  r than the secto
380b0 72 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  r size..*/.stati
380c0 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
380d0 45 20 69 6e 74 20 70 61 67 65 72 57 72 69 74 65  E int pagerWrite
380e0 4c 61 72 67 65 53 65 63 74 6f 72 28 50 67 48 64  LargeSector(PgHd
380f0 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  r *pPg){.  int r
38100 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
38110 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
38120 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f  n code */.  Pgno
38130 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
38140 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
38150 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
38160 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
38170 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 31  le */.  Pgno pg1
38180 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
38190 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
381a0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
381b0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
381c0 6f 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  on. */.  int nPa
381d0 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ge = 0;         
381e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
381f0 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
38200 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
38210 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  nal */.  int ii;
38220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38230 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
38240 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  unter */.  int n
38250 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20  eedSync = 0;    
38260 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
38270 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20  if any page has 
38280 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
38290 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  */.  Pager *pPag
382a0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
382b0 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74  ; /* The pager t
382c0 68 61 74 20 6f 77 6e 73 20 70 50 67 20 2a 2f 0a  hat owns pPg */.
382d0 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53    Pgno nPagePerS
382e0 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d  ector = (pPager-
382f0 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67  >sectorSize/pPag
38300 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
38310 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e    /* Set the doN
38320 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62  otSpill NOSYNC b
38330 69 74 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  it to 1. This is
38340 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
38350 6f 74 20 61 6c 6c 6f 77 0a 20 20 2a 2a 20 61 20  ot allow.  ** a 
38360 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
38370 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74  o be written bet
38380 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a  ween the pages j
38390 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20 20 2a 2a  ournaled by.  **
383a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
383b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
383c0 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
383d0 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
383e0 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
383f0 41 47 5f 4e 4f 53 59 4e 43 29 3d 3d 30 20 29 3b  AG_NOSYNC)==0 );
38400 0a 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  .  pPager->doNot
38410 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c  Spill |= SPILLFL
38420 41 47 5f 4e 4f 53 59 4e 43 3b 0a 0a 20 20 2f 2a  AG_NOSYNC;..  /*
38430 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
38440 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
38450 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
38460 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
38470 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
38480 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
38490 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
384a0 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
384b0 65 72 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  er.  ** of the f
384c0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
384d0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
384e0 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 2a 2f 0a  ocated on..  */.
384f0 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70    pg1 = ((pPg->p
38500 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65  gno-1) & ~(nPage
38510 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20  PerSector-1)) + 
38520 31 3b 0a 0a 20 20 6e 50 61 67 65 43 6f 75 6e 74  1;..  nPageCount
38530 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
38540 65 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67  e;.  if( pPg->pg
38550 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
38560 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50  .    nPage = (pP
38570 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31  g->pgno - pg1)+1
38580 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
38590 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
385a0 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
385b0 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  ){.    nPage = n
385c0 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
385d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
385e0 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
385f0 63 74 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ctor;.  }.  asse
38600 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 61  rt(nPage>0);.  a
38610 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
38620 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
38630 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d  (pg1+nPage)>pPg-
38640 3e 70 67 6e 6f 29 3b 0a 0a 20 20 66 6f 72 28 69  >pgno);..  for(i
38650 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
38660 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
38670 69 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ii++){.    Pgno 
38680 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
38690 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
386a0 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e     if( pg==pPg->
386b0 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33  pgno || !sqlite3
386c0 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
386d0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
386e0 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  g) ){.      if( 
386f0 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  pg!=PAGER_MJ_PGN
38700 4f 28 70 50 61 67 65 72 29 20 2