/ Hex Artifact Content
Login

Artifact 355f00af21d490a88e2e2e6aec26237a621de1be:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
71b0: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
71c0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
71d0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
71e0: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
71f0: 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61 67    u8 walSyncFlag
7200: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
7210: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
7220: 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77 61  SYNC_FULL for wa
7230: 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75 38  l writes */.  u8
7240: 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20   syncFlags;     
7250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7260: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7270: 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 20  _FULL otherwise 
7280: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
7290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
72a0: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
72b0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
72c0: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
72d0: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
72e0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
72f0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
7300: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ase */.  u8 memD
7310: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
7320: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
7330: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
7340: 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a   I/O */..  /****
7350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7390: 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ******.  ** The 
73a0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
73b0: 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73 65 20 63  contains those c
73c0: 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 74 68 61  lass members tha
73d0: 74 20 63 68 61 6e 67 65 20 64 75 72 69 6e 67 0a  t change during.
73e0: 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6f 70 65    ** routine ope
73f0: 72 74 69 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65  rtion.  Class me
7400: 6d 62 65 72 73 20 6e 6f 74 20 69 6e 20 74 68 69  mbers not in thi
7410: 73 20 62 6c 6f 63 6b 20 61 72 65 20 65 69 74 68  s block are eith
7420: 65 72 20 66 69 78 65 64 0a 20 20 2a 2a 20 77 68  er fixed.  ** wh
7430: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
7440: 66 69 72 73 74 20 63 72 65 61 74 65 64 20 6f 72  first created or
7450: 20 65 6c 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67   else only chang
7460: 65 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  e when there is 
7470: 61 0a 20 20 2a 2a 20 73 69 67 6e 69 66 69 63 61  a.  ** significa
7480: 6e 74 20 6d 6f 64 65 20 63 68 61 6e 67 65 20 28  nt mode change (
7490: 73 75 63 68 20 61 73 20 63 68 61 6e 67 69 6e 67  such as changing
74a0: 20 74 68 65 20 70 61 67 65 5f 73 69 7a 65 2c 20   the page_size, 
74b0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20  locking_mode,.  
74c0: 2a 2a 20 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  ** or the journa
74d0: 6c 5f 6d 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61  l_mode).  From a
74e0: 6e 6f 74 68 65 72 20 76 69 65 77 2c 20 74 68 65  nother view, the
74f0: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
7500: 20 64 65 73 63 72 69 62 65 0a 20 20 2a 2a 20 74   describe.  ** t
7510: 68 65 20 22 73 74 61 74 65 22 20 6f 66 20 74 68  he "state" of th
7520: 65 20 70 61 67 65 72 2c 20 77 68 69 6c 65 20 6f  e pager, while o
7530: 74 68 65 72 20 63 6c 61 73 73 20 6d 65 6d 62 65  ther class membe
7540: 72 73 20 64 65 73 63 72 69 62 65 20 74 68 65 0a  rs describe the.
7550: 20 20 2a 2a 20 22 63 6f 6e 66 69 67 75 72 61 74    ** "configurat
7560: 69 6f 6e 22 20 6f 66 20 74 68 65 20 70 61 67 65  ion" of the page
7570: 72 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 65 53 74  r..  */.  u8 eSt
7580: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
7590: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
75a0: 74 61 74 65 20 28 4f 50 45 4e 2c 20 52 45 41 44  tate (OPEN, READ
75b0: 45 52 2c 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  ER, WRITER_LOCKE
75c0: 44 2e 2e 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f  D..) */.  u8 eLo
75d0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
75e0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
75f0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61   lock held on da
7600: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7610: 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   u8 changeCountD
7620: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  one;         /* 
7630: 53 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d  Set after increm
7640: 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  enting the chang
7650: 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  e-counter */.  u
7660: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
7670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
7680: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
7690: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
76a0: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
76b0: 38 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20  8 doNotSpill;   
76c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
76d0: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
76e0: 61 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65  ache when non-ze
76f0: 72 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74  ro */.  u8 doNot
7700: 53 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20  SyncSpill;      
7710: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f      /* Do not do
7720: 20 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65   a spill that re
7730: 71 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63  quires jrnl sync
7740: 20 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d   */.  u8 subjInM
7750: 65 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  emory;          
7760: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
7770: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a   in-memory sub-j
7780: 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e  ournals */.  Pgn
7790: 6f 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  o dbSize;       
77a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
77b0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
77c0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
77d0: 20 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65   Pgno dbOrigSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68  dbSize before th
7800: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
7810: 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20  ction */.  Pgno 
7820: 64 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20  dbFileSize;     
7830: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7840: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7850: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7860: 2f 0a 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53  /.  Pgno dbHintS
7870: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
7880: 2f 2a 20 56 61 6c 75 65 20 70 61 73 73 65 64 20  /* Value passed 
7890: 74 6f 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  to FCNTL_SIZE_HI
78a0: 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  NT call */.  int
78b0: 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20   errCode;       
78c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
78d0: 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73  of several kinds
78e0: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
78f0: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
7900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7910: 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  ages journalled 
7920: 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61  since last j-hea
7930: 64 65 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  der written */. 
7940: 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20   u32 cksumInit; 
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7960: 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c  Quasi-random val
7970: 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72  ue added to ever
7980: 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  y checksum */.  
7990: 75 33 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20  u32 nSubRec;    
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
79b0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
79c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d   written to sub-
79d0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74  journal */.  Bit
79e0: 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b  vec *pInJournal;
79f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
7a00: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
7a10: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
7a20: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  e file */.  sqli
7a30: 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20  te3_file *fd;   
7a40: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
7a50: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64  descriptor for d
7a60: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
7a70: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
7a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
7a90: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
7aa0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
7ab0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7ac0: 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  sjfd;         /*
7ad0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7ae0: 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   for sub-journal
7af0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
7b00: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
7b10: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69    /* Current wri
7b20: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
7b30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
7b40: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
7b50: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
7b60: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
7b70: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
7b80: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71  l header */.  sq
7b90: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
7ba0: 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69  ackup;    /* Poi
7bb0: 6e 74 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20  nter to list of 
7bc0: 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70  ongoing backup p
7bd0: 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61  rocesses */.  Pa
7be0: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53  gerSavepoint *aS
7bf0: 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72  avepoint; /* Arr
7c00: 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61 76  ay of active sav
7c10: 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  epoints */.  int
7c20: 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20   nSavepoint;    
7c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7c40: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
7c50: 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a  n aSavepoint[] *
7c60: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
7c70: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
7c80: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
7c90: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
7ca0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 2f  e changes */.  /
7cb0: 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68  *.  ** End of th
7cc0: 65 20 72 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e  e routinely-chan
7cd0: 67 69 6e 67 20 63 6c 61 73 73 20 6d 65 6d 62 65  ging class membe
7ce0: 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rs.  ***********
7cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d30: 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b  /..  u16 nExtra;
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
7d60: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
7d70: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
7d80: 2f 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65  /.  i16 nReserve
7d90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7da0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
7db0: 73 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64  sed bytes at end
7dc0: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f   of each page */
7dd0: 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b  .  u32 vfsFlags;
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7df0: 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  * Flags for sqli
7e00: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
7e10: 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53  */.  u32 sectorS
7e20: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
7e30: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
7e40: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
7e50: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ollback */.  int
7e60: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
7e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7e80: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
7e90: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
7ea0: 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  mxPgno;         
7eb0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
7ec0: 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f  m allowed size o
7ed0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
7ee0: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
7ef0: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
7f00: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
7f10: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
7f20: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
7f30: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7f50: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
7f60: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
7f70: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
7f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
7f90: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
7fa0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28   file */.  int (
7fb0: 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
7fc0: 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69  oid*); /* Functi
7fd0: 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20  on to call when 
7fe0: 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  busy */.  void *
7ff0: 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
8000: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
8010: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42   argument for xB
8020: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
8030: 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b  int nHit, nMiss;
8040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8050: 6f 74 61 6c 20 63 61 63 68 65 20 68 69 74 73 20  otal cache hits 
8060: 61 6e 64 20 6d 69 73 73 65 73 20 2a 2f 0a 23 69  and misses */.#i
8070: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
8080: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
8090: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
80a0: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
80b0: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
80c0: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
80d0: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
80e0: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
80f0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
8100: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
8110: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8120: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
8130: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
8140: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
8150: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
8160: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
8170: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ata */.  void (*
8180: 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
8190: 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20  void*,int,int); 
81a0: 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67  /* Notify of pag
81b0: 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a  e size changes *
81c0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
81d0: 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  cFree)(void*);  
81e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
81f0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
8200: 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64   codec */.  void
8210: 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20   *pCodec;       
8220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
8230: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
8240: 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a  dec... methods *
8250: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
8260: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
8270: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
8280: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
8290: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
82a0: 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  use */.  PCache 
82b0: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
82c0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
82d0: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
82e0: 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ject */.#ifndef 
82f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
8300: 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20    Wal *pWal;    
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8320: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
8330: 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61   used by "journa
8340: 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20  l_mode=wal" */. 
8350: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8370: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72  File name for wr
8380: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f  ite-ahead log */
8390: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
83a0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
83b0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
83c0: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
83d0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
83e0: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
83f0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8400: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
8410: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
8420: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
8430: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
8440: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
8450: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
8460: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
8470: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
8480: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8490: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
84a0: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
84b0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
84c0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
84d0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
84e0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
84f0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8500: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8510: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
8520: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8530: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
8540: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
8550: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
8560: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
8570: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
8580: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
8590: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
85a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
85b0: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
85c0: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
85d0: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
85e0: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
85f0: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
8600: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
8610: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
8620: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8630: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
8640: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
8650: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
8660: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
8670: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8680: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
8690: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
86a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
86b0: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
86c0: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
86d0: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
86e0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
86f0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
8700: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
8710: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
8720: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8730: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
8740: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
8750: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
8760: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
8770: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
8780: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
8790: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
87a0: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
87b0: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
87c0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
87d0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
87e0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
87f0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8800: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
8810: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
8820: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8830: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
8840: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
8850: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
8860: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
8870: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
8880: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
8890: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
88a0: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
88b0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
88c0: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
88d0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
88e0: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
88f0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
8900: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
8910: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
8920: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8930: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
8940: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
8950: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
8960: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
8970: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
8980: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
8990: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
89a0: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
89b0: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
89c0: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
89d0: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
89e0: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
89f0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
8a00: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
8a10: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
8a20: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
8a30: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
8a40: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
8a50: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
8a60: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
8a70: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
8a80: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
8a90: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
8aa0: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
8ab0: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
8ac0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
8ad0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
8ae0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
8af0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
8b00: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
8b10: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
8b20: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
8b30: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
8b40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
8b50: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
8b60: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
8b70: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
8b80: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
8b90: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
8ba0: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
8bb0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
8bc0: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
8bd0: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
8be0: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
8bf0: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
8c00: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
8c10: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
8c20: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
8c30: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
8c40: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
8c50: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
8c60: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
8c70: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
8c80: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
8c90: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
8ca0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
8cb0: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
8cc0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
8cd0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
8ce0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
8cf0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
8d00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
8d10: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
8d20: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
8d30: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
8d40: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
8d50: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
8d60: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
8d70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
8d80: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
8d90: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
8da0: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
8db0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
8dc0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
8dd0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
8de0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
8df0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
8e00: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
8e10: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
8e20: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
8e30: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
8e40: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
8e50: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
8e60: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
8e70: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
8e80: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
8e90: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
8ea0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
8eb0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
8ec0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
8ed0: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
8ee0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
8ef0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8f00: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
8f10: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
8f20: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
8f30: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
8f40: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
8f50: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
8f60: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
8f70: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
8f80: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
8f90: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
8fa0: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
8fb0: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
8fc0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
8fd0: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
8fe0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8ff0: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
9000: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
9010: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
9020: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
9030: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
9040: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
9050: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
9060: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
9070: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
9080: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
9090: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20 30  rames(v,w,x,y) 0
90a0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 4f  .# define pagerO
90b0: 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
90c0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64  z) SQLITE_OK.# d
90d0: 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69 6e  efine pagerBegin
90e0: 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
90f0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  z) SQLITE_OK.#en
9100: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
9110: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  BUG ./*.** Usage
9120: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
9130: 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
9140: 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
9150: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9160: 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61 73  ion runs many as
9170: 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f 20  serts to try to 
9180: 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e  find inconsisten
9190: 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69  cies in.** the i
91a0: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
91b0: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
91c0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
91d0: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
91e0: 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ate(Pager *p){. 
91f0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
9200: 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   p;..  /* State 
9210: 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20 2a  must be valid. *
9220: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  /.  assert( p->e
9230: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
9240: 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  N.       || p->e
9250: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
9260: 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  DER.       || p-
9270: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9280: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
9290: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
92a0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
92b0: 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
92c0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
92d0: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
92e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
92f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9300: 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20  R_FINISHED.     
9310: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9320: 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b  PAGER_ERROR.  );
9330: 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73  ..  /* Regardles
9340: 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
9350: 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d 66   state, a temp-f
9360: 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ile connection a
9370: 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20 20  lways behaves.  
9380: 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73 20  ** as if it has 
9390: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
93a0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
93b0: 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65 72  e file. It never
93c0: 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74 68   updates.  ** th
93d0: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
93e0: 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20 63   field, so the c
93f0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
9400: 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  lag is always se
9410: 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
9420: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
9430: 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58   || p->eLock==EX
9440: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
9450: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
9460: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pFile==0 || pPag
9470: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
9480: 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  one );..  /* If 
9490: 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66  the useJournal f
94a0: 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
94b0: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d  e journal-mode m
94c0: 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a 20  ust be "OFF". . 
94d0: 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 6a   ** And if the j
94e0: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22  ournal-mode is "
94f0: 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61  OFF", the journa
9500: 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20  l file must not 
9510: 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20  be open..  */.  
9520: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9530: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9540: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9550: 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29   p->useJournal )
9560: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  ;.  assert( p->j
9570: 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
9580: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9590: 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e  F || !isOpen(p->
95a0: 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  jfd) );..  /* Ch
95b0: 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20 69  eck that MEMDB i
95c0: 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41  mplies noSync. A
95d0: 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nd an in-memory 
95e0: 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a  journal. Since .
95f0: 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73 20    ** this means 
9600: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
9610: 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49  er performs no I
9620: 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e  O at all, it can
9630: 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20  not encounter . 
9640: 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49 54   ** either SQLIT
9650: 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54  E_IOERR or SQLIT
9660: 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f  E_FULL during ro
9670: 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65 20  llback or while 
9680: 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a  finalizing .  **
9690: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
96a0: 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20 69   (although the i
96b0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
96c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
96d0: 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e  may .  ** return
96e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
96f0: 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  MEM while the jo
9700: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
9710: 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49 74  ing written). It
9720: 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65 66   .  ** is theref
9730: 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  ore not possible
9740: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
9750: 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  y pager to enter
9760: 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a   the ERROR .  **
9770: 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69   state..  */.  i
9780: 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
9790: 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e  assert( p->noSyn
97a0: 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c );.    assert(
97b0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
97c0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
97d0: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
97e0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
97f0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9800: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
9810: 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28    );.    assert(
9820: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9830: 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65 53  R_ERROR && p->eS
9840: 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
9850: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9860: 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d 3d  pagerUseWal(p)==
9870: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  0 );.  }..  /* I
9880: 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  f changeCountDon
9890: 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53 45  e is set, a RESE
98a0: 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65  RVED lock or gre
98b0: 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
98c0: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69  d.  ** on the fi
98d0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
98e0: 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  t( pPager->chang
98f0: 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c  eCountDone==0 ||
9900: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
9910: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
9920: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c  .  assert( p->eL
9930: 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
9940: 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  K );..  switch( 
9950: 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  p->eState ){.   
9960: 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45 4e   case PAGER_OPEN
9970: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9980: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20  !MEMDB );.      
9990: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
99a0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
99b0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
99c0: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
99d0: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
99e0: 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c  ->pPCache)==0 ||
99f0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
9a00: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
9a10: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
9a20: 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20 20  R_READER:.      
9a30: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9a40: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
9a50: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
9a60: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9a70: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
9a80: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9a90: 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
9aa0: 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64 6c 6f  K || p->noReadlo
9ab0: 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ck );.      brea
9ac0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9ad0: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
9ae0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
9af0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
9b00: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
9b10: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9b20: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
9b30: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
9b40: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
9b50: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
9b60: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9b70: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
9b80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9b90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ba0: 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  >dbSize==pPager-
9bb0: 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
9bc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9bd0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9be0: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
9bf0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9c00: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9c10: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9c20: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
9c30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9c40: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
9c50: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
9c60: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
9c70: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
9c80: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9c90: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
9ca0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
9cb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9cc0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9cd0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
9ce0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
9cf0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
9d00: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
9d10: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
9d20: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
9d30: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
9d40: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
9d50: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
9d60: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
9d70: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
9d80: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
9d90: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
9da0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
9db0: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
9dc0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
9dd0: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
9de0: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
9df0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9e00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9e10: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9e20: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
9e30: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
9e40: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
9e50: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9e60: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9e70: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9e80: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
9e90: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9ea0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
9eb0: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
9ec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9ed0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
9ee0: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
9ef0: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
9f00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9f10: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
9f20: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
9f30: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
9f40: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9f50: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
9f60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9f70: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
9f80: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
9f90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9fa0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9fb0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9fc0: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
9fd0: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
9fe0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9ff0: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
a000: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a010: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a020: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a030: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a040: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a050: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a060: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a070: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a080: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
a090: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a0a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a0b0: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
a0c0: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a0d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a0e0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a0f0: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
a100: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a110: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a120: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a130: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a140: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a150: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a160: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a170: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a180: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a190: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a1a0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a1b0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a1c0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a1d0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a1e0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a1f0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a200: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a210: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a220: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
a230: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
a240: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
a250: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
a260: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
a270: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
a280: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
a290: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
a2a0: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
a2b0: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
a2c0: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
a2d0: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
a2e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
a2f0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a300: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
a310: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a320: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
a330: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
a340: 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20 20  pPCache)>0 );.  
a350: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
a360: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
a370: 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 4e  ndif /* ifndef N
a380: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
a390: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a 2f   SQLITE_DEBUG ./
a3a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
a3b0: 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61 6e  inter to a human
a3c0: 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67   readable string
a3d0: 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75 66   in a static buf
a3e0: 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  fer.** containin
a3f0: 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  g the state of t
a400: 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
a410: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
a420: 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20 69  ument. This.** i
a430: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
a440: 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65 62   used within deb
a450: 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61 6d  uggers. For exam
a460: 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65 72  ple, as an alter
a470: 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70 72  native.** to "pr
a480: 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20  int *pPager" in 
a490: 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29  gdb:.**.** (gdb)
a4a0: 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72   printf "%s", pr
a4b0: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
a4c0: 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74 69  pPager).*/.stati
a4d0: 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70 61  c char *print_pa
a4e0: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
a4f0: 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  *p){.  static ch
a500: 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a  ar zRet[1024];..
a510: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
a520: 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20  tf(1024, zRet,. 
a530: 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20       "Filename: 
a540: 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20       %s\n".     
a550: 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20 20   "State:        
a560: 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e   %s errCode=%d\n
a570: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20  ".      "Lock:  
a580: 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20          %s\n".  
a590: 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64      "Locking mod
a5a0: 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  e:  locking_mode
a5b0: 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%s\n".      "Jo
a5c0: 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75  urnal mode:  jou
a5d0: 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  rnal_mode=%s\n".
a5e0: 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73        "Backing s
a5f0: 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25  tore: tempFile=%
a600: 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f  d memDb=%d useJo
a610: 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20  urnal=%d\n".    
a620: 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20    "Journal:     
a630: 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c    journalOff=%ll
a640: 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c  d journalHdr=%ll
a650: 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a 65  d\n".      "Size
a660: 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69 7a  :          dbsiz
a670: 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65 3d  e=%d dbOrigSize=
a680: 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25 64  %d dbFileSize=%d
a690: 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a  \n".      , p->z
a6a0: 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c  Filename.      ,
a6b0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
a6c0: 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  R_OPEN          
a6d0: 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20    ? "OPEN" :.   
a6e0: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
a6f0: 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20  PAGER_READER    
a700: 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52 22        ? "READER"
a710: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a720: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
a730: 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57  ER_LOCKED   ? "W
a740: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a  RITER_LOCKED" :.
a750: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
a760: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
a770: 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49 54  CACHEMOD ? "WRIT
a780: 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20  ER_CACHEMOD" :. 
a790: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a7a0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
a7b0: 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54 45  BMOD    ? "WRITE
a7c0: 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20  R_DBMOD" :.     
a7d0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a7e0: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
a7f0: 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46 49  HED ? "WRITER_FI
a800: 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20 20  NISHED" :.      
a810: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
a820: 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20  ER_ERROR        
a830: 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20 22     ? "ERROR" : "
a840: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
a850: 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65   (int)p->errCode
a860: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63  .      , p->eLoc
a870: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20  k==NO_LOCK      
a880: 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a     ? "NO_LOCK" :
a890: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
a8a0: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
a8b0: 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22 20     ? "RESERVED" 
a8c0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
a8d0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a8e0: 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56 45  CK  ? "EXCLUSIVE
a8f0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a900: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
a910: 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44 22  K     ? "SHARED"
a920: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
a930: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
a940: 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22  K    ? "UNKNOWN"
a950: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
a960: 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76     , p->exclusiv
a970: 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73 69  eMode ? "exclusi
a980: 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20  ve" : "normal". 
a990: 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61       , p->journa
a9a0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9b0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
a9c0: 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20    ? "memory" :. 
a9d0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
a9e0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9f0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
aa00: 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20 20    ? "off" :.    
aa10: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
aa20: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
aa30: 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f  LMODE_DELETE   ?
aa40: 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20 20   "delete" :.    
aa50: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
aa60: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
aa70: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f  LMODE_PERSIST  ?
aa80: 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20 20   "persist" :.   
aa90: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
aaa0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
aab0: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
aac0: 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a 20  ? "truncate" :. 
aad0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
aae0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aaf0: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
ab00: 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65 72    ? "wal" : "?er
ab10: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69  ror?".      , (i
ab20: 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20  nt)p->tempFile, 
ab30: 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28  (int)p->memDb, (
ab40: 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61  int)p->useJourna
ab50: 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  l.      , p->jou
ab60: 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72  rnalOff, p->jour
ab70: 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20 28  nalHdr.      , (
ab80: 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28  int)p->dbSize, (
ab90: 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a  int)p->dbOrigSiz
aba0: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c  e, (int)p->dbFil
abb0: 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65  eSize.  );..  re
abc0: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e  turn zRet;.}.#en
abd0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
abe0: 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20  n true if it is 
abf0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
ac00: 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74  te page *pPg int
ac10: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
ac20: 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65  l..** A page nee
ac30: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
ac40: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
ac50: 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65  urnal if there e
ac60: 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20  xists one.** or 
ac70: 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  more open savepo
ac80: 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a  ints for which:.
ac90: 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
aca0: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge-number is les
acb0: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
acc0: 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  to PagerSavepoin
acd0: 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20  t.nOrig, and.** 
ace0: 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72    * The bit corr
acf0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
ad00: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
ad10: 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20  not set in.**   
ad20: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
ad30: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a  .pInSavepoint..*
ad40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
ad50: 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67  jRequiresPage(Pg
ad60: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e  Hdr *pPg){.  Pgn
ad70: 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
ad80: 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
ad90: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
ada0: 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  r;.  int i;.  fo
adb0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
adc0: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
add0: 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65  ){.    PagerSave
ade0: 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67  point *p = &pPag
adf0: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
ae00: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
ae10: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
ae20: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
ae30: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
ae40: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
ae50: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
ae60: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
ae70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ae80: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
ae90: 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
aea0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
aeb0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
aec0: 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50   pageInJournal(P
aed0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
aee0: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
aef0: 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67  ecTest(pPg->pPag
af00: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
af10: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f  pPg->pgno);.}../
af20: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
af30: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
af40: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
af50: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
af60: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
af70: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
af80: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
af90: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
afa0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
afb0: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
afc0: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
afd0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
afe0: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
aff0: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
b000: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
b010: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
b020: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
b030: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
b040: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
b050: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
b060: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
b070: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
b080: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
b090: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
b0a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b0b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
b0c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
b0d0: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
b0e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b0f0: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
b100: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
b110: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
b120: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
b130: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
b140: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
b150: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
b160: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f  te((u8*)A,B).../
b170: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
b180: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
b190: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
b1a0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
b1b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
b1c0: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
b1d0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
b1e0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
b1f0: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
b200: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
b210: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
b220: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
b230: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
b240: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
b250: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
b260: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
b270: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
b280: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
b290: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
b2a0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
b2b0: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
b2c0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
b2d0: 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41  O_LOCK.** or SHA
b2e0: 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64  RED_LOCK. Regard
b2f0: 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
b300: 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20  or not the call 
b310: 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  to xUnlock().** 
b320: 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74 68  succeeds, set th
b330: 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  e Pager.eLock va
b340: 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20  riable to match 
b350: 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29 20  the (attempted) 
b360: 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  new lock..**.** 
b370: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
b380: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
b390: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
b3a0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
b3b0: 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64   is.** called, d
b3c0: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e  o not modify it.
b3d0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
b3e0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
b3f0: 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57  ne of .** UNKNOW
b400: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
b410: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69  planation of thi
b420: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
b430: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50   pagerUnlockDb(P
b440: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
b450: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
b460: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b470: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
b480: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
b490: 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e || pPager->eLo
b4a0: 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61  ck==eLock );.  a
b4b0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f  ssert( eLock==NO
b4c0: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
b4d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
b4e0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d   assert( eLock!=
b4f0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72  NO_LOCK || pager
b500: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
b510: 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
b520: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
b530: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
b540: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ger->eLock>=eLoc
b550: 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  k );.    rc = sq
b560: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
b570: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
b580: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
b590: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
b5a0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  _LOCK ){.      p
b5b0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
b5c0: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  u8)eLock;.    }.
b5d0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
b5e0: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
b5f0: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
b600: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b610: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
b620: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
b630: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
b640: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
b650: 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ther SHARED_LOCK
b660: 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f  ,.** RESERVED_LO
b670: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
b680: 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c  LOCK. If the cal
b690: 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75  ler is successfu
b6a0: 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61  l, set the.** Pa
b6b0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
b6c0: 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f  le to the new lo
b6d0: 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a  cking state. .**
b6e0: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b6f0: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b700: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b710: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b720: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c  tion is .** call
b730: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
b740: 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20  y it unless the 
b750: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
b760: 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e is EXCLUSIVE_L
b770: 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65  OCK. .** See the
b780: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
b790: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e  he #define of UN
b7a0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b7b0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a  n explanation .*
b7c0: 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  * of this..*/.st
b7d0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f  atic int pagerLo
b7e0: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
b7f0: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
b800: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b810: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
b820: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
b830: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45  OCK || eLock==RE
b840: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
b850: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
b860: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
b870: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63  ager->eLock<eLoc
b880: 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  k || pPager->eLo
b890: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
b8a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
b8b0: 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
b8c0: 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20  r->fd, eLock);. 
b8d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b8e0: 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d  E_OK && (pPager-
b8f0: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
b900: 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43  LOCK||eLock==EXC
b910: 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a  LUSIVE_LOCK) ){.
b920: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
b930: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
b940: 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
b950: 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
b960: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
b970: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b980: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b990: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
b9a0: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
b9b0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
b9c0: 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
b9d0: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
b9e0: 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70  used with this p
b9f0: 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69  ager. The optimi
ba00: 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
ba10: 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61  ed if:.**.**  (a
ba20: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
ba30: 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65  rned by OsDevice
ba40: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
ba50: 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  ) indicates that
ba60: 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62  .**      a datab
ba70: 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20  ase page may be 
ba80: 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
ba90: 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20  ly, and.**  (b) 
baa0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
bab0: 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69  ed by OsSectorSi
bac0: 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61  ze() is less tha
bad0: 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20  n or equal.**   
bae0: 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73     to the page s
baf0: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ize..**.** The o
bb00: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61  ptimization is a
bb10: 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c  lso always enabl
bb20: 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  ed for temporary
bb30: 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a   files. It is.**
bb40: 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c   an error to cal
bb50: 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
bb60: 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65  if pPager is ope
bb70: 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d  ned on an in-mem
bb80: 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  ory.** database.
bb90: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  .**.** If the op
bba0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f  timization canno
bbb0: 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20  t be used, 0 is 
bbc0: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
bbd0: 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20  can be used,.** 
bbe0: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
bbf0: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73  eturned is the s
bc00: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
bc10: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a  al file when it.
bc20: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c  ** contains roll
bc30: 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78  back data for ex
bc40: 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a  actly one page..
bc50: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
bc60: 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
bc70: 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20  RITE.static int 
bc80: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50  jrnlBufferSize(P
bc90: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
bca0: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
bcb0: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
bcc0: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
bcd0: 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20    int dc;       
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68      /* Device ch
bd00: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
bd10: 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72  .    int nSector
bd20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bd30: 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72         /* Sector
bd40: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74   size */.    int
bd50: 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20   szPage;        
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd70: 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a  * Page size */..
bd80: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
bd90: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
bda0: 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74  ;.    dc = sqlit
bdb0: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
bdc0: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
bdd0: 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74  ->fd);.    nSect
bde0: 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63  or = pPager->sec
bdf0: 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50  torSize;.    szP
be00: 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
be10: 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73  geSize;..    ass
be20: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
be30: 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
be40: 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72  >>8));.    asser
be50: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
be60: 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
be70: 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30  >>8));.    if( 0
be80: 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f  ==(dc&(SQLITE_IO
be90: 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61  CAP_ATOMIC|(szPa
bea0: 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74  ge>>8)) || nSect
beb0: 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20  or>szPage) ){.  
bec0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bed0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
bee0: 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  n JOURNAL_HDR_SZ
bef0: 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e  (pPager) + JOURN
bf00: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
bf10: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
bf20: 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  * If SQLITE_CHEC
bf30: 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e  K_PAGES is defin
bf40: 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f  ed then we do so
bf50: 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  me sanity checki
bf60: 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63  ng.** on the cac
bf70: 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20  he using a hash 
bf80: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
bf90: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
bfa0: 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67  ing.** and debug
bfb0: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
bfc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
bfd0: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
bfe0: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
bff0: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
c000: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
c010: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
c020: 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20  er_datahash(int 
c030: 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20  nByte, unsigned 
c040: 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20  char *pData){.  
c050: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
c060: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
c070: 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b  ; i<nByte; i++){
c080: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
c090: 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b  h*1039) + pData[
c0a0: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
c0b0: 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20   hash;.}.static 
c0c0: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
c0d0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
c0e0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  {.  return pager
c0f0: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d  _datahash(pPage-
c100: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
c110: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
c120: 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61  r *)pPage->pData
c130: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
c140: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
c150: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
c160: 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65  ){.  pPage->page
c170: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
c180: 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a  ehash(pPage);.}.
c190: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
c1a0: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
c1b0: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
c1c0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
c1d0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c1e0: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
c1f0: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
c200: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
c210: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
c220: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
c230: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
c240: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
c250: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
c260: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
c270: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
c280: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
c290: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
c2a0: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
c2b0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
c2c0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
c2d0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
c2e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
c2f0: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
c300: 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  R );.  assert( (
c310: 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
c320: 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e  _DIRTY) || pPg->
c330: 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f  pageHash==pager_
c340: 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b  pagehash(pPg) );
c350: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .}..#else.#defin
c360: 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  e pager_datahash
c370: 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65  (X,Y)  0.#define
c380: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
c390: 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  X)  0.#define pa
c3a0: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
c3b0: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43  (X).#define CHEC
c3c0: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
c3d0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
c3e0: 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a  K_PAGES */../*.*
c3f0: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
c400: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
c410: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
c420: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
c430: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75  open..** This fu
c440: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
c450: 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72  to read a master
c460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c470: 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  me from the .** 
c480: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
c490: 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66  and, if successf
c4a0: 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e  ul, copies it in
c4b0: 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69  to memory suppli
c4c0: 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ed .** by the ca
c4d0: 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  ller. See commen
c4e0: 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61  ts above writeMa
c4f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
c500: 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20  r the format.** 
c510: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
c520: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c530: 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20  ile name at the 
c540: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
c550: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61   file..**.** zMa
c560: 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20  ster must point 
c570: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
c580: 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20  t least nMaster 
c590: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
c5a0: 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  by.** the caller
c5b0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
c5c0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
c5d0: 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e  athname+1 (to en
c5e0: 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  sure there is.**
c5f0: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
c600: 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   write the maste
c610: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e  r journal name).
c620: 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   If the master j
c630: 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69  ournal.** name i
c640: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
c650: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61   longer than nMa
c660: 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c  ster bytes (incl
c670: 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74  uding a.** nul-t
c680: 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e  erminator), then
c690: 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64   this is handled
c6a0: 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72   as if no master
c6b0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a   journal name.**
c6c0: 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e   were present in
c6d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
c6e0: 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20  .** If a master 
c6f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c700: 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20  e is present at 
c710: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
c720: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20  ournal.** file, 
c730: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
c740: 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  d into the buffe
c750: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
c760: 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75  zMaster. A.** nu
c770: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
c780: 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  e is appended to
c790: 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c   the buffer foll
c7a0: 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  owing the master
c7b0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
c7c0: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
c7d0: 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  it is determined
c7e0: 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20   that no master 
c7f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c800: 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a  e is present .**
c810: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73   zMaster[0] is s
c820: 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
c830: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
c840: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
c850: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
c860: 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
c870: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e  journal file, an
c880: 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72   SQLite.** error
c890: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
c8a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
c8b0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
c8c0: 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  al(sqlite3_file 
c8d0: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d  *pJrnl, char *zM
c8e0: 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74  aster, u32 nMast
c8f0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c910: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
c920: 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20   */.  u32 len;  
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79   /* Length in by
c950: 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  tes of master jo
c960: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
c970: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
c980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
c990: 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tal size in byte
c9a0: 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  s of journal fil
c9b0: 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32  e pJrnl */.  u32
c9c0: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
c9d0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68          /* MJ ch
c9e0: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61  ecksum value rea
c9f0: 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
ca00: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca20: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
ca30: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73  counter */.  uns
ca40: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
ca50: 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66  c[8];   /* A buf
ca60: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
ca70: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
ca80: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
ca90: 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  \0';..  if( SQLI
caa0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
cab0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
cac0: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20  Jrnl, &szJ)).   
cad0: 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20  || szJ<16.   || 
cae0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
caf0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
cb00: 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29  l, szJ-16, &len)
cb10: 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61  ).   || len>=nMa
cb20: 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49  ster .   || SQLI
cb30: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
cb40: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
cb50: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
cb60: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
cb70: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
cb80: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
cb90: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
cba0: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
cbb0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
cbc0: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
cbd0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
cbe0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
cbf0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
cc00: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
cc10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
cc20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
cc30: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
cc40: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
cc50: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
cc60: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
cc70: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
cc80: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
cc90: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
cca0: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
ccb0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
ccc0: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
ccd0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
cce0: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
ccf0: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
cd00: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
cd10: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
cd20: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
cd30: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
cd40: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
cd50: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
cd60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
cd70: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
cd80: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
cd90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
cda0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
cdb0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
cdc0: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
cdd0: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
cde0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
cdf0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
ce00: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
ce10: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
ce20: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
ce30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
ce40: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
ce50: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
ce60: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
ce70: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
ce80: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
ce90: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
cea0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
ceb0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
cec0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
ced0: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
cee0: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
cef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf10: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
cf80: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
cf90: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
cfa0: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
cfb0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
cfc0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
cfd0: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
cfe0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
cff0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d000: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
d010: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
d020: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
d030: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
d040: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d050: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
d060: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
d070: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d080: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
d090: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
d0a0: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
d0b0: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
d0c0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
d0d0: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
d0e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
d0f0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
d100: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
d110: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d120: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d130: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
d140: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
d150: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
d160: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
d170: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
d180: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
d190: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
d1a0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
d1b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
d1c0: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
d1d0: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
d1e0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
d1f0: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
d200: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
d210: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
d220: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
d230: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
d240: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
d250: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
d260: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
d270: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d280: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
d290: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
d2a0: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
d2b0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
d2c0: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
d2d0: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
d2e0: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
d2f0: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
d300: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
d310: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d320: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
d330: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
d340: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
d350: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
d360: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
d370: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
d380: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
d390: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
d3a0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
d3b0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
d3c0: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
d3d0: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
d3e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d3f0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d400: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
d410: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
d420: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
d430: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
d440: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
d450: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
d460: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
d470: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
d480: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
d490: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
d4a0: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
d4b0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
d4c0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
d4d0: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
d4e0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
d4f0: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
d500: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
d510: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
d540: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
d550: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
d560: 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70  >jfd) );.  if( p
d570: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d580: 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  f ){.    const i
d590: 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67  64 iLimit = pPag
d5a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
d5b0: 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  imit;    /* Loca
d5c0: 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a  l cache of jsl *
d5d0: 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  /..    IOTRACE((
d5e0: 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c  "JZEROHDR %p\n",
d5f0: 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66   pPager)).    if
d600: 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20  ( doTruncate || 
d610: 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  iLimit==0 ){.   
d620: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d630: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
d640: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  ->jfd, 0);.    }
d650: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74  else{.      stat
d660: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65  ic const char ze
d670: 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b  roHdr[28] = {0};
d680: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d690: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
d6a0: 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c  r->jfd, zeroHdr,
d6b0: 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29   sizeof(zeroHdr)
d6c0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
d6d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d6e0: 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
d6f0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
d700: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
d710: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
d720: 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
d730: 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  LY|pPager->syncF
d740: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
d750: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
d760: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
d770: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
d780: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
d790: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
d7a0: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
d7b0: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
d7c0: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
d7d0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
d7e0: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
d7f0: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
d800: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d810: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
d820: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
d830: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
d840: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
d850: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
d860: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
d870: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
d880: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
d890: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
d8a0: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
d8b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d8c0: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
d8d0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
d8e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d8f0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
d900: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
d910: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
d920: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
d930: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
d940: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
d950: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
d960: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
d970: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d990: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
d9a0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
d9b0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
d9c0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
d9d0: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
d9e0: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
d9f0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
da00: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
da10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
da20: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
da30: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
da40: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
da50: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
da60: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
da70: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
da80: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
da90: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
daa0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
dab0: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
dac0: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
dad0: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
dae0: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
daf0: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
db00: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
db10: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
db20: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
db30: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
db40: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
db50: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
db60: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
db70: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
db80: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
db90: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
dba0: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
dbb0: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
dbc0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
dbd0: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
dbe0: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
dbf0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
dc00: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
dc10: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
dc20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc40: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
dc50: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
dc60: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
dc70: 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61  ace;  /* Tempora
dc80: 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  ry space used to
dc90: 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f   build header */
dca0: 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d  .  u32 nHeader =
dcb0: 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61   (u32)pPager->pa
dcc0: 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f  geSize;/* Size o
dcd0: 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  f buffer pointed
dce0: 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a   to by zHeader *
dcf0: 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20  /.  u32 nWrite; 
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
dd20: 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f   of header secto
dd30: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  r written */.  i
dd40: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
dd70: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
dd80: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
dd90: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
dda0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
ddb0: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
ddc0: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
ddd0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
dde0: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
ddf0: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
de00: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
de10: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
de20: 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
de30: 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66  oints and any of
de40: 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74   them were creat
de50: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
de60: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a  he most recent j
de70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61  ournal header wa
de80: 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  s written, updat
de90: 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
dea0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
deb0: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77  ffset fields now
dec0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
ded0: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
dee0: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
def0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
df00: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
df10: 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b  iHdrOffset==0 ){
df20: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
df30: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
df40: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
df50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
df60: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
df70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
df80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
df90: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
dfa0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
dfb0: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
dfc0: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
dfd0: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
dfe0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
dff0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
e000: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
e010: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
e020: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
e030: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
e040: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
e050: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
e060: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
e070: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
e080: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
e090: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
e0a0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
e0b0: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
e0c0: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
e0d0: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
e0e0: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
e0f0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
e100: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
e110: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
e120: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
e130: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
e140: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
e150: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
e160: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
e170: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
e180: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
e190: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
e1a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e1b0: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
e1c0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
e1d0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
e1e0: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
e1f0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
e200: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  e occurred whils
e210: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
e220: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
e230: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
e240: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
e250: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
e260: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
e270: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
e280: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
e290: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
e2a0: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
e2b0: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
e2c0: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
e2d0: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
e2e0: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
e2f0: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
e300: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
e310: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
e320: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
e330: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
e340: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
e350: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
e360: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
e370: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
e380: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
e390: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
e3a0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e3b0: 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
e3c0: 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69  r->noSync );.  i
e3d0: 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
e3e0: 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  c || (pPager->jo
e3f0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
e400: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
e410: 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69  ORY).   || (sqli
e420: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
e430: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
e440: 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  r->fd)&SQLITE_IO
e450: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
e460: 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70   .  ){.    memcp
e470: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
e480: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
e490: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
e4a0: 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  ;.    put32bits(
e4b0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e4c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
e4d0: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
e4e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
e4f0: 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69  t(zHeader, 0, si
e500: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e510: 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ic)+4);.  }..  /
e520: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
e530: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
e540: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
e550: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
e560: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
e570: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
e580: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
e590: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e5a0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e5b0: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
e5c0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
e5d0: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
e5e0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
e5f0: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
e600: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
e610: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
e620: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
e630: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
e640: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
e650: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
e660: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
e670: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
e680: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e690: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
e6a0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  ectorSize);..  /
e6b0: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
e6c0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
e6d0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e6e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
e6f0: 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ], pPager->pageS
e700: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  ize);..  /* Init
e710: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69  ializing the tai
e720: 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  l of the buffer 
e730: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
e740: 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20  .  Everything.  
e750: 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66  ** works find if
e760: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
e770: 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74  emset() is omitt
e780: 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c  ed.  But initial
e790: 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  izing.  ** the m
e7a0: 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76  emory prevents v
e7b0: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d  algrind from com
e7c0: 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20  plaining, so we 
e7d0: 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20  are willing to. 
e7e0: 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72   ** take the per
e7f0: 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20  formance hit..  
e800: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65  */.  memset(&zHe
e810: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e820: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20  rnalMagic)+20], 
e830: 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61  0,.         nHea
e840: 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75  der-(sizeof(aJou
e850: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b  rnalMagic)+20));
e860: 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79  ..  /* In theory
e870: 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63  , it is only nec
e880: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
e890: 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61  the 28 bytes tha
e8a0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72  t the .  ** jour
e8b0: 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75  nal header consu
e8c0: 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  mes to the journ
e8d0: 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68  al file here. Th
e8e0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  en increment the
e8f0: 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75   .  ** Pager.jou
e900: 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65  rnalOff variable
e910: 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   by JOURNAL_HDR_
e920: 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  SZ so that the n
e930: 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64  ext .  ** record
e940: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
e950: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63  he following sec
e960: 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67  tor (leaving a g
e970: 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20  ap in the file. 
e980: 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65   ** that will be
e990: 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c   implicitly fill
e9a0: 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29  ed in by the OS)
e9b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65  ..  **.  ** Howe
e9c0: 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ver it has been 
e9d0: 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
e9e0: 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  on some systems 
e9f0: 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e  this pattern can
ea00: 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66   .  ** be signif
ea10: 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74  icantly slower t
ea20: 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  han contiguously
ea30: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
ea40: 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20   the file,.  ** 
ea50: 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
ea60: 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72  ns explicitly wr
ea70: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
ea80: 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a  e block of .  **
ea90: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
eaa0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61   - 28) bytes tha
eab0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  t will not be us
eac0: 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77  ed. So that is w
ead0: 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65  hat.  ** is done
eae0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
eaf0: 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65   loop is require
eb00: 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74  d here in case t
eb10: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
eb20: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
eb30: 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
eb40: 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63   page size. Sinc
eb50: 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75  e the zHeader bu
eb60: 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67  ffer is only Pag
eb70: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a  er.pageSize.  **
eb80: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
eb90: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61  more than one ca
eba0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57  ll to sqlite3OsW
ebb0: 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65  rite() may be re
ebc0: 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70  quired.  ** to p
ebd0: 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69  opulate the enti
ebe0: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
ebf0: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a  r sector..  */ .
ec00: 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20    for(nWrite=0; 
ec10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e  rc==SQLITE_OK&&n
ec20: 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44  Write<JOURNAL_HD
ec30: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57  R_SZ(pPager); nW
ec40: 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a  rite+=nHeader){.
ec50: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
ec60: 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
ec70: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
ec80: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48  ->journalHdr, nH
ec90: 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d  eader)).    rc =
eca0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ecb0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
ecc0: 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70  ader, nHeader, p
ecd0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ece0: 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  f);.    assert( 
ecf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
ed00: 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  dr <= pPager->jo
ed10: 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
ed20: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ed30: 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20  ff += nHeader;. 
ed40: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
ed50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
ed60: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
ed70: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
ed80: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
ed90: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
eda0: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
edb0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
edc0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
edd0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
ede0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
edf0: 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65   file. The curre
ee00: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
ee10: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ee20: 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70  is given by.** p
ee30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ee40: 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  f. See comments 
ee50: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
ee60: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
ee70: 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69   for.** a descri
ee80: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  ption of the jou
ee90: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
eea0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
eeb0: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
eec0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70  successfully, *p
eed0: 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  NRec is set to t
eee0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
eef0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
ef00: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
ef10: 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20  er and *pDbSize 
ef20: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
ef30: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
ef40: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
ef50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
ef60: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
ef70: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
ef80: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
ef90: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
efa0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
efb0: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
efc0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
efd0: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
efe0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
eff0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
f000: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
f010: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
f020: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
f030: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65  turned and *pNRe
f040: 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61  c and *PDbSize a
f050: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49  re undefined.  I
f060: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
f070: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
f080: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
f090: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
f0a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
f0b0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
f0c0: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
f0d0: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
f0e0: 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
f0f0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
f100: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
f110: 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75  isHot,.  i64 jou
f120: 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20  rnalSize,       
f130: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f140: 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   the open journa
f150: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
f160: 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c  */.  u32 *pNRec,
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
f190: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52  read from the nR
f1a0: 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33  ec field */.  u3
f1b0: 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20  2 *pDbSize      
f1c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
f1d0: 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67  T: Value of orig
f1e0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  inal database si
f1f0: 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20  ze field */.){. 
f200: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f220: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
f230: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
f240: 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f  aMagic[8];     /
f250: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
f260: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
f270: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  der */.  i64 iHd
f280: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
f290: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
f2a0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
f2b0: 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a  r being read */.
f2c0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
f2d0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
f2e0: 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61  ;      /* Journa
f2f0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f300: 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64  pen. */..  /* Ad
f310: 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72  vance Pager.jour
f320: 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74  nalOff to the st
f330: 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
f340: 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20  sector. If the. 
f350: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
f360: 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f   is too small fo
f370: 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20  r there to be a 
f380: 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74  header stored at
f390: 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74   this.  ** point
f3a0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
f3b0: 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  DONE..  */.  pPa
f3c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
f3d0: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
f3e0: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
f3f0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f400: 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lOff+JOURNAL_HDR
f410: 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f  _SZ(pPager) > jo
f420: 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20  urnalSize ){.   
f430: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
f440: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  ONE;.  }.  iHdrO
f450: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
f460: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52  rnalOff;..  /* R
f470: 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74  ead in the first
f480: 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   8 bytes of the 
f490: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
f4a0: 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d  If they do not m
f4b0: 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d  atch.  ** the  m
f4c0: 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e  agic string foun
f4d0: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
f4e0: 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68  f each journal h
f4f0: 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20  eader, return.  
f500: 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  ** SQLITE_DONE. 
f510: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
f520: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e  ccurs, return an
f530: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
f540: 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f  erwise,.  ** pro
f550: 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ceed..  */.  if(
f560: 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66   isHot || iHdrOf
f570: 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f!=pPager->journ
f580: 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20  alHdr ){.    rc 
f590: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
f5a0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
f5b0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
f5c0: 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20  ic), iHdrOff);. 
f5d0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
f5e0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f5f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63    }.    if( memc
f600: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
f610: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
f620: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
f630: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
f640: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
f650: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
f660: 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33  he first three 3
f670: 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20  2-bit fields of 
f680: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f690: 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a  er: The nRec.  *
f6a0: 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65  * field, the che
f6b0: 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65  cksum-initialize
f6c0: 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  r and the databa
f6d0: 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73  se size at the s
f6e0: 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
f6f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65   transaction. Re
f700: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
f710: 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
f720: 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a  oes wrong..  */.
f730: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
f740: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
f750: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
f760: 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29  HdrOff+8, pNRec)
f770: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
f780: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
f790: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
f7a0: 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50   iHdrOff+12, &pP
f7b0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
f7c0: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
f7d0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
f7e0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
f7f0: 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62   iHdrOff+16, pDb
f800: 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20  Size)).  ){.    
f810: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
f820: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
f830: 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
f840: 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65     u32 iPageSize
f850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f860: 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65  /* Page-size fie
f870: 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  ld of journal he
f880: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  ader */.    u32 
f890: 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20  iSectorSize;    
f8a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74           /* Sect
f8b0: 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  or-size field of
f8c0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f8d0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  */..    /* Read 
f8e0: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
f8f0: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f  d sector-size jo
f900: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65  urnal header fie
f910: 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  lds. */.    if( 
f920: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f930: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f940: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f950: 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a  +20, &iSectorSiz
f960: 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49  e)).     || SQLI
f970: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f980: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
f990: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c  jfd, iHdrOff+24,
f9a0: 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20   &iPageSize)).  
f9b0: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
f9c0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
f9d0: 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20   /* Versions of 
f9e0: 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20  SQLite prior to 
f9f0: 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70 61  3.5.8 set the pa
fa00: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
fa10: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
fa20: 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65  nal header to ze
fa30: 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ro. In this case
fa40: 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
fa50: 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  e Pager.pageSize
fa60: 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
fa70: 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
fa80: 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  to the correct p
fa90: 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  age size..    */
faa0: 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69  .    if( iPageSi
fab0: 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ze==0 ){.      i
fac0: 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
fad0: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
fae0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
faf0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
fb00: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
fb10: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
fb20: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
fb30: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
fb40: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
fb50: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
fb60: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
fb70: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
fb80: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
fb90: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
fba0: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
fbb0: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
fbc0: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
fbd0: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
fbe0: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
fbf0: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
fc00: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
fc10: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
fc20: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
fc30: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
fc40: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
fc50: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
fc60: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
fc70: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
fc80: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
fc90: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
fca0: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
fcb0: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
fcc0: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
fcd0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
fce0: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
fcf0: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
fd00: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
fd10: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
fd20: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
fd30: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
fd40: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
fd50: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
fd60: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
fd70: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
fd80: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
fd90: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
fda0: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
fdb0: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
fdc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
fdd0: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
fde0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fdf0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
fe00: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
fe10: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
fe20: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
fe30: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
fe40: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
fe50: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
fe60: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
fe70: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
fe80: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
fe90: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
fea0: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
feb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
fec0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
fed0: 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
fee0: 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29   &iPageSize, -1)
fef0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ff00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
ff10: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
ff20: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
ff30: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
ff40: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
ff50: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
ff60: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
ff70: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
ff80: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
ff90: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
ffa0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
ffb0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
ffc0: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
ffd0: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
ffe0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
fff0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
10000 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
10010 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
10020 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
10030 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
10040 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
10050 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
10060 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
10070 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
10080 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
10090 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
100a0 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
100b0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
100c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
100d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
100e0 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
100f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10100 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
10110 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
10120 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
10130 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
10140 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
10150 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
10160 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
10170 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
10180 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
10190 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
101a0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
101b0 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
101c0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
101d0 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
101e0 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
101f0 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
10200 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
10210 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
10220 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
10230 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
10240 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
10250 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
10260 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
10270 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
10280 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
10290 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
102a0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
102b0 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
102c0 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
102d0 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
102e0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
102f0 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
10300 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
10310 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
10320 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
10330 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
10340 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
10350 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
10360 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
10370 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
10380 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
10390 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
103a0 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
103b0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
103c0 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
103d0 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
103e0 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
103f0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
10400 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
10410 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10420 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
10430 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
10440 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
10450 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
10460 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10490 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
104a0 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
104b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
104c0 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
104d0 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
104e0 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
104f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10500 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
10510 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
10520 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
10530 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10540 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10550 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
10560 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
10570 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
10580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
10590 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
105a0 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
105b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
105c0 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
105d0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
105e0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
105f0 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
10600 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  r .   || pPager-
10610 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
10620 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
10630 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50  MEMORY .   || pP
10640 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
10650 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
10660 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20  MODE_OFF .  ){. 
10670 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10680 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
10690 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
106a0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
106b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
106c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
106d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
106e0 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
106f0 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
10700 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
10710 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
10720 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
10730 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
10740 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
10750 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
10760 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
10770 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
10780 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
10790 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
107a0 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
107b0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
107c0 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
107d0 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
107e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
107f0 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
10800 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
10810 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
10820 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
10830 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
10840 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
10850 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
10860 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
10870 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10880 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
10890 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
108a0 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
108b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
108c0 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
108d0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
108e0 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
108f0 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
10900 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
10910 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10920 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
10930 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
10940 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
10950 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
10960 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
10970 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
10980 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
10990 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
109a0 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
109b0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
109c0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
109d0 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
109e0 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
109f0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10a00 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10a10 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
10a20 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
10a30 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
10a40 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
10a50 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10a60 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
10a70 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
10a80 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
10a90 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
10aa0 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
10ab0 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34  ic, 8, iHdrOff+4
10ac0 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
10ad0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10ae0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10af0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
10b00 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f  Master+20);..  /
10b10 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
10b20 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
10b30 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
10b40 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
10b50 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
10b60 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
10b70 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
10b80 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
10b90 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
10ba0 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
10bb0 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
10bc0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
10bd0 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
10be0 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
10bf0 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
10c00 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
10c10 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
10c20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
10c30 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
10c40 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
10c50 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
10c60 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
10c70 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
10c80 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
10c90 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
10ca0 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
10cb0 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
10cc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
10cd0 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
10ce0 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
10cf0 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45  */ .  if( SQLITE
10d00 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
10d10 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
10d20 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53  ger->jfd, &jrnlS
10d30 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c  ize)).   && jrnl
10d40 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75  Size>pPager->jou
10d50 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20  rnalOff.  ){.   
10d60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
10d70 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
10d80 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
10d90 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  rnalOff);.  }.  
10da0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10db0 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
10dc0 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
10dd0 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
10de0 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a   number. Return.
10df0 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
10e00 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
10e10 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65   if the requeste
10e20 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a  d page is not .*
10e30 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d  * already in mem
10e40 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ory..*/.static P
10e50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
10e60 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
10e70 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
10e80 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ea0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
10eb0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73  e */..  /* It is
10ec0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
10ed0 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63  r a call to Pcac
10ee0 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63  heFetch() with c
10ef0 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a  reateFlag==0 to.
10f00 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65    ** fail, since
10f10 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   no attempt to a
10f20 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20  llocate dynamic 
10f30 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d  memory will be m
10f40 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69  ade..  */.  (voi
10f50 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  d)sqlite3PcacheF
10f60 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
10f70 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
10f80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  p);.  return p;.
10f90 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
10fa0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
10fb0 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d  ents of the in-m
10fc0 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65  emory page-cache
10fd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10fe0 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
10ff0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
11000 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
11010 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
11020 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
11030 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
11040 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
11050 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73  /*.** Free all s
11060 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
11070 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
11080 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65  t[] array and se
11090 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e  t both.** Pager.
110a0 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50  aSavepoint and P
110b0 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20  ager.nSavepoint 
110c0 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74  to zero. Close t
110d0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
110e0 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20  * if it is open 
110f0 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
11100 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
11110 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  e mode..*/.stati
11120 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c  c void releaseAl
11130 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65  lSavepoints(Page
11140 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
11150 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
11160 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
11170 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  for looping thro
11180 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70  ugh Pager.aSavep
11190 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69  oint */.  for(ii
111a0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
111b0 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
111c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
111d0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
111e0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
111f0 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b  ].pInSavepoint);
11200 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
11210 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
11220 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65  e || sqlite3IsMe
11230 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
11240 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71  >sjfd) ){.    sq
11250 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
11260 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a  ger->sjfd);.  }.
11270 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11280 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11290 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53  t);.  pPager->aS
112a0 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
112b0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
112c0 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
112d0 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d  ->nSubRec = 0;.}
112e0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
112f0 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  bit number pgno 
11300 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65  in the PagerSave
11310 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
11320 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f  nt .** bitvecs o
11330 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  f all open savep
11340 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51  oints. Return SQ
11350 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
11360 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49  ssful.** or SQLI
11370 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
11380 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
11390 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
113a0 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  nt addToSavepoin
113b0 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a  tBitvecs(Pager *
113c0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
113d0 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  o){.  int ii;   
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
11400 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
11410 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f  LITE_OK;       /
11420 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
11430 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ..  for(ii=0; ii
11440 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
11450 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
11460 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
11470 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
11480 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20  vepoint[ii];.   
11490 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f   if( pgno<=p->nO
114a0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
114b0 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  |= sqlite3Bitvec
114c0 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  Set(p->pInSavepo
114d0 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  int, pgno);.    
114e0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
114f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
11500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
11510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
11520 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11530 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
11540 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11550 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11560 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
11570 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
11580 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
11590 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  d not.** in the 
115a0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
115b0 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63  erwise, it switc
115c0 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  hes the pager to
115d0 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73   PAGER_OPEN.** s
115e0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
115f0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
11600 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
11610 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61  ess mode, the da
11620 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a  tabase file is.*
11630 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c  * completely unl
11640 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69  ocked. If the fi
11650 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61  le is unlocked a
11660 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  nd the file-syst
11670 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  em does.** not e
11680 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c  xhibit the UNDEL
11690 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
116a0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a   property, the j
116b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
116c0 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20  * closed (if it 
116d0 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20  is open)..**.** 
116e0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
116f0 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
11700 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
11710 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
11720 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
11730 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
11740 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62   are discarded b
11750 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
11760 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20  back to .** the 
11770 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61  OPEN state. Rega
11780 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
11790 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  r the pager is i
117a0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
117b0 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20  .** or not, any 
117c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66  journal file lef
117d0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
117e0 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65  stem will be tre
117f0 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74  ated.** as a hot
11800 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
11810 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78  led back the nex
11820 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72  t time a read-tr
11830 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
11840 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20  opened (by this 
11850 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20  or by any other 
11860 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a  connection)..*/.
11870 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
11880 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
11890 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65  pPager){..  asse
118a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
118b0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
118c0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
118d0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
118e0 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c  R_OPEN .       |
118f0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
11900 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20  ==PAGER_ERROR . 
11910 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69   );..  sqlite3Bi
11920 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11930 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
11940 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
11950 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c  urnal = 0;.  rel
11960 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
11970 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  s(pPager);..  if
11980 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
11990 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
119a0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
119b0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
119c0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
119d0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
119e0 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
119f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
11a00 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
11a10 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
11a20 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
11a30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20   ){.    int rc; 
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
11a60 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  ode returned by 
11a70 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20  pagerUnlockDb() 
11a80 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d  */.    int iDc =
11a90 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
11aa0 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76  fd)?sqlite3OsDev
11ab0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
11ac0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30  cs(pPager->fd):0
11ad0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
11ae0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
11af0 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69  m support deleti
11b00 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73  on of open files
11b10 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c  , then.    ** cl
11b20 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
11b30 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69  file when droppi
11b40 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
11b50 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65  lock.  Otherwise
11b60 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20  .    ** another 
11b70 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
11b80 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c  journal_mode=del
11b90 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65  ete might delete
11ba0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
11bb0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
11bc0 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  us..    */.    a
11bd0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11be0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
11bf0 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
11c00 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
11c10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
11c20 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b        & 5)!=1 );
11c30 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
11c40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
11c50 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31  WAL      & 5)!=1
11c60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11c70 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
11c80 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29  DE_DELETE   & 5)
11c90 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
11ca0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11cb0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26  LMODE_TRUNCATE &
11cc0 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)==1 );.    as
11cd0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11ce0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
11cf0 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20    & 5)==1 );.   
11d00 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53   if( 0==(iDc & S
11d10 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
11d20 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
11d30 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70  N).     || 1!=(p
11d40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
11d50 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20  de & 5).    ){. 
11d60 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
11d70 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
11d80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11d90 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11da0 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
11db0 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20  te and the call 
11dc0 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  to unlock the da
11dd0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
11de0 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68  le fails, set th
11df0 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74  e current lock t
11e00 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20  o UNKNOWN_LOCK. 
11e10 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a  See the comment.
11e20 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65      ** above the
11e30 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b   #define for UNK
11e40 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
11e50 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
11e60 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  why this.    ** 
11e70 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
11e80 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
11e90 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
11ea0 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  er, NO_LOCK);.  
11eb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11ec0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65  _OK && pPager->e
11ed0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
11ee0 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OR ){.      pPag
11ef0 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e  er->eLock = UNKN
11f00 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  OWN_LOCK;.    }.
11f10 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
11f20 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63  r state may be c
11f30 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45  hanged from PAGE
11f40 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52  R_ERROR to PAGER
11f50 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a  _OPEN here.    *
11f60 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69  * without cleari
11f70 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ng the error cod
11f80 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e  e. This is inten
11f90 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72  tional - the err
11fa0 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69  or.    ** code i
11fb0 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68  s cleared and th
11fc0 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e  e cache reset in
11fd0 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77   the block below
11fe0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
11ff0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
12000 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Code || pPager->
12010 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
12020 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ROR );.    pPage
12030 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
12040 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
12050 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12060 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20  ER_OPEN;.  }..  
12070 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43  /* If Pager.errC
12080 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20  ode is set, the 
12090 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
120a0 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e  pager cache cann
120b0 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74  ot be.  ** trust
120c0 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
120d0 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
120e0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
120f0 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20   to the pager,. 
12100 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c   ** it can safel
12110 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50  y move back to P
12120 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e  AGER_OPEN state.
12130 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
12140 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61   both.  ** norma
12150 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d  l and exclusive-
12160 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20  locking mode..  
12170 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
12180 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
12190 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
121a0 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
121b0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  t(pPager);.    p
121c0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
121d0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
121e0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70  >tempFile;.    p
121f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12200 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
12210 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12220 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
12230 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
12240 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
12250 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
12260 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
12270 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d  setMaster = 0;.}
12280 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
12290 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
122a0 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52  whenever an IOER
122b0 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20  R or FULL error 
122c0 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a  that requires.**
122d0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 72   the pager to tr
122e0 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ansition into th
122f0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61  e ERROR state ma
12300 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e  y ahve occurred.
12310 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
12320 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
12330 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
12340 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20   structure, the 
12350 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65  second .** the e
12360 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
12370 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
12380 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
12390 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20  nction. The .** 
123a0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
123b0 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
123c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
123d0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
123e0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
123f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
12400 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  is SQLITE_FULL, 
12410 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
12420 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f  one of the.** IO
12430 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74  ERR sub-codes, t
12440 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73 20  he pager enters 
12450 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
12460 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
12470 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  de.** is stored 
12480 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  in Pager.errCode
12490 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  . While the page
124a0 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65  r remains in the
124b0 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a   ERROR state,.**
124c0 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63   all major API c
124d0 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65  alls on the Page
124e0 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
124f0 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e  ly return Pager.
12500 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  errCode..**.** T
12510 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
12520 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
12530 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12540 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a  e pager-cache .*
12550 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  * cannot be trus
12560 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20  ted. This state 
12570 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62  can be cleared b
12580 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  y completely dis
12590 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20  carding .** the 
125a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
125b0 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20  pager-cache. If 
125c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
125d0 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a  s active when.**
125e0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
125f0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
12600 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
12610 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65  k journal may ne
12620 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c  ed.** to be repl
12630 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ayed to restore 
12640 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12650 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12660 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77  e (as if.** it w
12670 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ere a hot-journa
12680 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l)..*/.static in
12690 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
126a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
126b0 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
126c0 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
126d0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
126e0 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29  E_OK || !MEMDB )
126f0 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
12700 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
12710 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
12720 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
12730 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12740 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
12750 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12760 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
12770 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
12780 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
12790 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45  L || rc2==SQLITE
127a0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50  _IOERR ){.    pP
127b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
127c0 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
127d0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  eState = PAGER_E
127e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
127f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12800 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
12810 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
12820 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   A transaction i
12830 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20  s usually ended 
12840 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20  by .** either a 
12850 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
12860 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  BACK operation. 
12870 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
12880 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61   be called .** a
12890 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  fter rollback of
128a0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20   a hot-journal, 
128b0 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
128c0 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
128d0 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ing.** the journ
128e0 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69  al file or writi
128f0 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73  ng the very firs
12900 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
12910 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73   of a.** databas
12920 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
12930 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
12940 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
12950 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f  ed in PAGER_ERRO
12960 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69  R state. If it i
12970 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50  s called.** in P
12980 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47  AGER_NONE or PAG
12990 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20  ER_SHARED state 
129a0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c  and the lock hel
129b0 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63  d is less.** exc
129c0 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45  lusive than a RE
129d0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20  SERVED lock, it 
129e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
129f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
12a00 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
12a10 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
12a20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
12a30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
12a40 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
12a50 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
12a60 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
12a70 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
12a80 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
12a90 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
12aa0 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
12ab0 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
12ac0 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
12ad0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
12ae0 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
12af0 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
12b00 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
12b10 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
12b20 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
12b30 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
12b40 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
12b50 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
12b60 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
12b70 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
12b80 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
12b90 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
12ba0 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
12bb0 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
12bc0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
12bd0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
12be0 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
12bf0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
12c00 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
12c10 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
12c20 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
12c30 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
12c40 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
12c50 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
12c60 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
12c70 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
12c80 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
12c90 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
12ca0 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12cb0 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
12cc0 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
12cd0 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
12ce0 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
12cf0 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
12d00 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
12d10 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
12d20 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
12d30 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
12d40 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
12d50 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
12d60 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
12d70 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
12d80 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
12d90 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
12da0 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
12db0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
12dc0 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
12dd0 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
12de0 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
12df0 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
12e00 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12e10 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12e20 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
12e30 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
12e40 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
12e50 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
12e60 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
12e70 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
12e80 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
12e90 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
12ea0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
12eb0 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
12ec0 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
12ed0 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
12ee0 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
12ef0 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
12f00 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
12f10 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
12f20 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65  , the pager move
12f30 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  s to PAGER_READE
12f40 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72  R state..** If r
12f50 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
12f60 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b  clusive rollback
12f70 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
12f80 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a  on the file is .
12f90 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
12fa0 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a   a SHARED_LOCK..
12fb0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
12fc0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
12fd0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
12fe0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12ff0 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
13000 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
13010 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
13020 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13030 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
13040 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
13050 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
13060 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
13070 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
13080 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
13090 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
130a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
130b0 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
130c0 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
130d0 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
130e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
130f0 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
13100 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
13110 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
13120 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
13130 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
13140 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
13150 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
13160 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
13170 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
13180 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
13190 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
131a0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
131b0 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
131c0 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
131d0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
131e0 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
131f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13200 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13210 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
13220 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
13230 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
13240 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
13250 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13260 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
13270 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
13280 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  */..  /* Do noth
13290 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72  ing if the pager
132a0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
132b0 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
132c0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72  nsaction.  ** or
132d0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
132e0 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20  RVED lock. This 
132f0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
13300 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
13310 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69  e.  ** is no wri
13320 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
13330 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45  ctive but a RESE
13340 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
13350 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c  lock is.  ** hel
13360 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63  d under two circ
13370 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a  umstances:.  **.
13380 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20    **   1. After 
13390 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74  a successful hot
133a0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
133b0 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20  k, it is called 
133c0 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65  with.  **      e
133d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
133e0 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43  E and eLock==EXC
133f0 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a  LUSIVE_LOCK..  *
13400 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61  *.  **   2. If a
13410 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
13420 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
13430 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20  clusive holding 
13440 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  an EXCLUSIVE .  
13450 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69  **      lock swi
13460 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f  tches back to lo
13470 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
13480 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75  l and then execu
13490 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20  tes a.  **      
134a0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
134b0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
134c0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65  is called with e
134d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
134e0 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61  DER .  **      a
134f0 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
13500 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  IVE_LOCK when th
13510 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
13520 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20  on is closed..  
13530 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  */.  assert( ass
13540 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
13550 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
13560 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
13570 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
13580 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
13590 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
135a0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20  RITER_LOCKED && 
135b0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45  pPager->eLock<RE
135c0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
135d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
135e0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65  _OK;.  }..  rele
135f0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
13600 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
13610 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
13620 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
13630 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
13640 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
13650 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
13660 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
13670 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13680 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
13690 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
136a0 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
136b0 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  f( sqlite3IsMemJ
136c0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
136d0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fd) ){.      ass
136e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
136f0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
13700 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
13710 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  RY );.      sqli
13720 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13730 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  r->jfd);.    }el
13740 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
13750 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13760 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
13770 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UNCATE ){.      
13780 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13790 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
137a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
137b0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
137c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
137d0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
137e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
137f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13810 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
13820 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
13830 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13840 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
13850 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70  SIST.      || (p
13860 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
13870 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
13880 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
13890 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
138a0 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  AL).    ){.     
138b0 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
138c0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
138d0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
138e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
138f0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
13900 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
13910 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78  branch may be ex
13920 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65  ecuted with Page
13930 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d  r.journalMode==M
13940 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a  EMORY if.      *
13950 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
13960 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20  was just rolled 
13970 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
13980 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  se the journal. 
13990 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f       ** file sho
139a0 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  uld be closed an
139b0 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  d deleted. If th
139c0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
139d0 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ites to.      **
139e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
139f0 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73  le, it will do s
13a00 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65  o using an in-me
13a10 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20  mory journal. . 
13a20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
13a30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
13a40 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13a50 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
13a60 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
13a70 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
13a80 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13a90 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
13aa0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13ab0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13ac0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13ad0 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
13ae0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
13af0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13b00 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
13b10 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
13b20 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
13b30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
13b40 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
13b50 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
13b60 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
13b70 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
13b80 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
13b90 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
13ba0 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
13bb0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13bc0 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
13bd0 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
13be0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
13bf0 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
13c00 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
13c10 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
13c20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 61 67    PgHdr *p = pag
13c30 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
13c40 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 1);.    if( p 
13c50 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65  ){.      p->page
13c60 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hash = 0;.      
13c70 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
13c80 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  f(p);.    }.  }.
13c90 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
13ca0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
13cb0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13cc0 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
13cd0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
13ce0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
13cf0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
13d00 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
13d10 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
13d20 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
13d30 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
13d40 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
13d50 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ize);..  if( pag
13d60 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
13d70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
13d80 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
13d90 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
13da0 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
13db0 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
13dc0 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
13dd0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
13de0 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
13df0 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
13e00 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
13e10 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
13e20 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
13e30 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
13e40 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
13e50 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
13e60 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
13e70 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
13e80 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
13e90 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
13ea0 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20  siveMode .   && 
13eb0 28 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  (!pagerUseWal(pP
13ec0 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33  ager) || sqlite3
13ed0 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
13ee0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30  (pPager->pWal, 0
13ef0 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20  )).  ){.    rc2 
13f00 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
13f10 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
13f20 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
13f30 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
13f40 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  e = 0;.  }.  pPa
13f50 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
13f60 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50  GER_READER;.  pP
13f70 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
13f80 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28  = 0;..  return (
13f90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
13fa0 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
13fb0 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
13fc0 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
13fd0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
13fe0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
13ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14000 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14010 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
14020 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f  entered the ERRO
14030 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  R state, do not 
14040 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20  attempt .** the 
14050 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73  rollback at this
14060 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20   time. Instead, 
14070 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
14080 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a  s called. The.**
14090 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
140a0 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73  nlock() will dis
140b0 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
140c0 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b  ry pages, unlock
140d0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
140e0 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74   file and move t
140f0 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f  he pager back to
14100 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20   OPEN state. If 
14110 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74  this .** means t
14120 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 68  hat there is a h
14130 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ot-journal left 
14140 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
14150 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a  em, the next .**
14160 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f   connection to o
14170 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
14180 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72  ock on the pager
14190 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74   (which may be t
141a0 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c  his one) .** wil
141b0 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  l roll it back..
141c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
141d0 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  er has not alrea
141e0 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
141f0 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
14200 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c  an IO or.** mall
14210 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
14220 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
14230 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c  k, then this wil
14240 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a  l itself cause .
14250 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
14260 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
14270 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c  state. Which wil
14280 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  l be cleared by 
14290 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  the.** call to p
142a0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61  ager_unlock(), a
142b0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
142c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
142d0 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  d pagerUnlockAnd
142e0 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
142f0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
14300 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
14310 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50  AGER_ERROR && pP
14320 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
14330 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
14340 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
14350 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
14360 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  r) );.    if( pP
14370 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
14380 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
14390 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D ){.      sqlit
143a0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
143b0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c  loc();.      sql
143c0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
143d0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
143e0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
143f0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d  nMalloc();.    }
14400 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
14410 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
14420 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14430 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
14440 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
14450 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64  .      pager_end
14460 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
14470 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
14480 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
14490 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
144a0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
144b0 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
144c0 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
144d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
144e0 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
144f0 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
14500 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
14510 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
14520 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
14530 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
14540 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
14550 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
14560 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
14570 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
14580 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
14590 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
145a0 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
145b0 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
145c0 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
145d0 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
145e0 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
145f0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
14600 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
14610 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
14620 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14630 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
14640 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
14650 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
14660 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
14670 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
14680 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
14690 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
146a0 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
146b0 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
146c0 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
146d0 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
146e0 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
146f0 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
14700 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
14710 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
14720 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
14730 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
14740 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
14750 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
14760 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
14770 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
14780 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
14790 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
147a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
147b0 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
147c0 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
147d0 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
147e0 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
147f0 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
14800 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
14810 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
14820 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
14830 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
14840 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
14850 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
14860 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
14870 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
14880 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
14890 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
148a0 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
148b0 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
148c0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
148d0 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
148e0 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
148f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
14900 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
14910 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
14920 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
14930 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
14940 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
14950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  ;.}../*.** Repor
14960 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
14970 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62  ge size and numb
14980 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
14990 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  ytes back.** to 
149a0 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69  the codec..*/.#i
149b0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
149c0 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69  CODEC.static voi
149d0 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  d pagerReportSiz
149e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
149f0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
14a00 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29  xCodecSizeChng )
14a10 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43  {.    pPager->xC
14a20 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61  odecSizeChng(pPa
14a30 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61  ger->pCodec, pPa
14a40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
14a70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29  Pager->nReserve)
14a80 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
14a90 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f  define pagerRepo
14aa0 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a  rtSize(X)     /*
14ab0 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20   No-op if we do 
14ac0 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f  not support a co
14ad0 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  dec */.#endif../
14ae0 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
14af0 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74  le page from eit
14b00 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  her the journal 
14b10 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a  file (if isMainJ
14b20 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72  rnl==1) or.** fr
14b30 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
14b40 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  al (if isMainJrn
14b50 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61  l==0) and playba
14b60 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a  ck that page..**
14b70 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73   The page begins
14b80 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66   at offset *pOff
14b90 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
14ba0 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a  e. The *pOffset.
14bb0 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72  ** value is incr
14bc0 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61  eased to the sta
14bd0 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  rt of the next p
14be0 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
14bf0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  al..**.** The ma
14c00 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
14c10 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75  nal uses checksu
14c20 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65  ms - the stateme
14c30 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
14c40 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  .** not..**.** I
14c50 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
14c60 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65  r of the page re
14c70 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
14c80 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
14c90 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
14ca0 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
14cb0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
14cc0 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e  ger.dbSize, then
14cd0 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20   playback is.** 
14ce0 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49  skipped and SQLI
14cf0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
14d00 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e  d..**.** If pDon
14d10 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
14d20 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f  hen it is a reco
14d30 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  rd of pages that
14d40 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a   have already.**
14d50 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
14d60 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  k.  If the page 
14d70 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20  at *pOffset has 
14d80 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
14d90 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20  yed back.** (if 
14da0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
14db0 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73  g pDone bit is s
14dc0 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  et) then skip th
14dd0 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d  e playback..** M
14de0 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f  ake sure the pDo
14df0 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  ne bit correspon
14e00 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66  ding to the *pOf
14e10 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74  fset page is set
14e20 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74  .** prior to ret
14e30 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
14e40 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
14e50 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
14e60 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
14e70 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
14e80 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20  e.** and played 
14e90 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54  back, then SQLIT
14ea0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
14eb0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
14ec0 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65   occurs.** while
14ed0 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63   reading the rec
14ee0 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ord from the (su
14ef0 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
14f00 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  or while writing
14f10 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
14f20 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
14f30 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
14f40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
14f50 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63   data.** is succ
14f60 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
14f70 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
14f80 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70  rnal file but ap
14f90 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63  pears to be.** c
14fa0 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
14fb0 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
14fc0 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69  d. Data is consi
14fd0 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20  dered corrupted 
14fe0 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d  in.** two circum
14ff0 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  stances:.** .** 
15000 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
15010 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  d page-number is
15020 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50   illegal (0 or P
15030 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f  AGER_MJ_PGNO), o
15040 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  r.**   * If the 
15050 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20  record is being 
15060 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d  rolled back from
15070 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
15080 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e  l file.**     an
15090 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  d the checksum f
150a0 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ield does not ma
150b0 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63  tch the record c
150c0 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65  ontent..**.** Ne
150d0 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
150e0 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65  wo scenarios are
150f0 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67   possible during
15100 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15110 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
15120 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f  this is a savepo
15130 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  int rollback, th
15140 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61  en memory may ha
15150 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  ve to be dynamic
15160 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
15170 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
15180 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  on. If this is t
15190 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61  he case and an a
151a0 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
151b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
151c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
151d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
151e0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
151f0 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
15200 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
15210 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
15220 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
15230 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f  ack */.  i64 *pO
15240 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
15250 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
15260 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c   of record to pl
15270 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76  ayback */.  Bitv
15280 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20  ec *pDone,      
15290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
152a0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
152b0 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b  eady played back
152c0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e   */.  int isMain
152d0 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Jrnl,           
152e0 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e      /* 1 -> main
152f0 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73   journal. 0 -> s
15300 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
15310 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20   int isSavepnt  
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15330 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76  * True for a sav
15340 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
15350 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
15360 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15380 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
15390 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
153a0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
153d0 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
153e0 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
153f0 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15410 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
15420 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
15430 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ing */.  char *a
15440 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
15450 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
15460 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20  ary storage for 
15470 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71  the page */.  sq
15480 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
15490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
154a0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
154b0 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  or for the journ
154c0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
154d0 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20   isSynced;      
154e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
154f0 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61  ue if journal pa
15500 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  ge is synced */.
15510 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
15520 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
15530 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
15540 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
15550 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
15560 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
15570 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
15580 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
15590 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
155a0 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
155b0 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
155c0 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
155d0 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
155e0 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
155f0 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
15600 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
15610 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
15620 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
15630 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  ta = pPager->pTm
15640 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
15650 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
15660 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
15670 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
15680 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
15690 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ted */.  assert(
156a0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
156b0 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d  ger)==0 || (!isM
156c0 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76  ainJrnl && isSav
156d0 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  epnt) );..  /* E
156e0 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20  ither the state 
156f0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
15700 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
15710 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63  HEMOD (a transac
15720 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61  tion .  ** or sa
15730 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15740 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71   done at the req
15750 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c  uest of the call
15760 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20  er) or this is. 
15770 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
15780 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69  l rollback. If i
15790 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t is a hot-journ
157a0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  al rollback, the
157b0 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69   pager.  ** is i
157c0 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64  n state OPEN and
157d0 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53   holds an EXCLUS
157e0 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f  IVE lock. Hot-jo
157f0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20  urnal rollback. 
15800 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66   ** only reads f
15810 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
15820 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75  rnal, not the su
15830 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  b-journal..  */.
15840 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15850 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
15860 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
15870 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
15880 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
15890 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d  _OPEN && pPager-
158a0 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
158b0 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61  E_LOCK).  );.  a
158c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
158d0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
158e0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20  TER_CACHEMOD || 
158f0 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20  isMainJrnl );.. 
15900 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
15910 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
15920 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
15930 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
15940 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
15950 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
15960 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
15970 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72  ller if an IO er
15980 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f  ror occurs..  */
15990 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a  .  jfd = isMainJ
159a0 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  rnl ? pPager->jf
159b0 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  d : pPager->sjfd
159c0 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
159d0 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65  its(jfd, *pOffse
159e0 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
159f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15a00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
15a10 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
15a20 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  (jfd, (u8*)aData
15a30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
15a40 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34  ze, (*pOffset)+4
15a50 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15a60 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
15a70 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b  rc;.  *pOffset +
15a80 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
15a90 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a  ze + 4 + isMainJ
15aa0 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  rnl*4;..  /* San
15ab0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
15ac0 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
15ad0 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
15ae0 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
15af0 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
15b00 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
15b10 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
15b20 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
15b30 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
15b40 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
15b50 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
15b60 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
15b70 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
15b80 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
15b90 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
15ba0 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
15bb0 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
15bc0 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
15bd0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
15be0 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
15bf0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
15c00 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
15c10 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29  rt( !isSavepnt )
15c20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15c30 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
15c40 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70  if( pgno>(Pgno)p
15c50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c  Pager->dbSize ||
15c60 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
15c70 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20  st(pDone, pgno) 
15c80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15c90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
15ca0 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
15cb0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
15cc0 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66  bits(jfd, (*pOff
15cd0 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b  set)-4, &cksum);
15ce0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
15cf0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
15d00 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
15d10 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
15d20 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d  r, (u8*)aData)!=
15d30 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
15d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
15d50 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
15d60 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
15d70 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
15d80 20 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f 72   played by befor
15d90 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  e during the cur
15da0 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  rent.  ** rollba
15db0 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62  ck, then don't b
15dc0 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74  other to play it
15dd0 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a   back again..  *
15de0 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26  /.  if( pDone &&
15df0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69   (rc = sqlite3Bi
15e00 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70  tvecSet(pDone, p
15e10 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  gno))!=SQLITE_OK
15e20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
15e30 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  c;.  }..  /* Whe
15e40 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70  n playing back p
15e50 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74  age 1, restore t
15e60 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74  he nReserve sett
15e70 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
15e80 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72  gno==1 && pPager
15e90 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38  ->nReserve!=((u8
15ea0 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a  *)aData)[20] ){.
15eb0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
15ec0 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61  erve = ((u8*)aDa
15ed0 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67  ta)[20];.    pag
15ee0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
15ef0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
15f00 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
15f10 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74  in CACHEMOD stat
15f20 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
15f30 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
15f40 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
15f50 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
15f60 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
15f70 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
15f80 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
15f90 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
15fa0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
15fb0 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
15fc0 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
15fd0 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
15fe0 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
15ff0 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
16000 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
16010 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
16020 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
16030 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
16040 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
16050 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
16060 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
16070 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
16080 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
16090 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
160a0 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
160b0 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
160c0 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
160d0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
160e0 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
160f0 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
16100 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
16110 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
16120 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
16130 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
16140 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
16150 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
16160 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52  WRITER_DBMOD, WR
16170 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72  ITER_FINISHED or
16180 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65   OPEN state, the
16190 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a  n we update the.
161a0 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65    ** pager cache
161b0 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e   if it exists an
161c0 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
161d0 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
161e0 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e  n marked .  ** n
161f0 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20  ot dirty. Since 
16200 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c  this code is onl
16210 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41  y executed in PA
16220 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66  GER_OPEN state f
16230 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  or.  ** a hot-jo
16240 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
16250 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
16260 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63   that the page-c
16270 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20  ache is empty.  
16280 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
16290 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65  is in OPEN state
162a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
162b0 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
162c0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
162d0 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
162e0 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
162f0 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
16300 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
16310 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
16320 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
16330 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
16340 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
16350 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
16360 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
16370 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
16380 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
16390 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
163a0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
163b0 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
163c0 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
163d0 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
163e0 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
163f0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
16400 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
16410 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
16420 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
16430 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
16440 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74  s are synced int
16450 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  o the main rollb
16460 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
16470 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  .  Otherwise, a 
16480 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74  power loss might
16490 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20   leave modified 
164a0 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a  data in the.  **
164b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
164c0 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20  ithout an entry 
164d0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
164e0 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e  journal that can
164f0 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68  .  ** restore th
16500 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
16510 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e  s original form.
16520 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
16530 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65   must be.  ** me
16540 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
16550 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16560 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
16570 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
16580 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28  .  ** locked.  (
16590 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
165a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
165b0 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c  e content is ful
165c0 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69  ly synced.  ** i
165d0 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
165e0 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
165f0 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
16600 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c  t in cache or el
16610 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  se.  ** the page
16620 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
16630 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a  edSync==0..  **.
16640 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a    ** 2008-04-14:
16650 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e    When attemptin
16660 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f  g to vacuum a co
16670 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
16680 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  ile, it.  ** is 
16690 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c  possible to fail
166a0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20   a statement on 
166b0 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  a database that 
166c0 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69  does not yet exi
166d0 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  st..  ** Do not 
166e0 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
166f0 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   if database fil
16700 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
16710 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
16720 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
16730 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70  pPager) ){.    p
16740 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
16750 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
16760 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
16770 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
16780 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
16790 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
167a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
167b0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
167c0 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  g==0 );.  PAGERT
167d0 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
167e0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
167f0 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
16800 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
16810 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
16820 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
16830 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
16840 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20  (u8*)aData),.   
16850 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
16860 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
16870 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
16880 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73  ).  ));.  if( is
16890 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
168a0 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  isSynced = pPage
168b0 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70  r->noSync || (*p
168c0 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72  Offset <= pPager
168d0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
168e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79   }else{.    isSy
168f0 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c  nced = (pPg==0 |
16900 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
16910 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
16920 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NC));.  }.  if( 
16930 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
16940 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  d).   && (pPager
16950 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
16960 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
16970 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
16980 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26  PAGER_OPEN).   &
16990 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
169a0 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
169b0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
169c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
169d0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
169e0 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
169f0 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
16a00 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
16a10 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
16a20 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
16a30 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
16a40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
16a50 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
16a60 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
16a70 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
16a80 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
16a90 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
16aa0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
16ab0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
16ac0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
16ad0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
16ae0 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Backup ){.      
16af0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
16b00 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
16b10 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
16b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
16b30 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
16b40 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
16b50 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20  , (u8*)aData);. 
16b60 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
16b70 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
16b80 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   7, rc=SQLITE_NO
16b90 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  MEM, aData);.   
16ba0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
16bb0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
16bc0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
16bd0 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
16be0 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
16bf0 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
16c00 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
16c10 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
16c20 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
16c30 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
16c40 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
16c50 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
16c60 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
16c70 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
16c80 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
16c90 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
16ca0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
16cb0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
16cc0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
16cd0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
16ce0 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
16cf0 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
16d00 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
16d10 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
16d20 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
16d30 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
16d40 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
16d50 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
16d60 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
16d70 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
16d80 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
16d90 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
16da0 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
16db0 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
16dc0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
16dd0 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
16de0 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
16df0 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
16e00 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
16e10 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
16e20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
16e30 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
16e40 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
16e50 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
16e60 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
16e70 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
16e80 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
16e90 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
16ea0 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
16eb0 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
16ec0 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
16ed0 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
16ee0 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
16ef0 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
16f00 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
16f10 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
16f20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
16f30 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
16f40 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
16f50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16f60 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b  doNotSpill==0 );
16f70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
16f80 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72  otSpill++;.    r
16f90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16fa0 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
16fb0 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a  pgno, &pPg, 1);.
16fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16fd0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d  er->doNotSpill==
16fe0 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
16ff0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20  >doNotSpill--;. 
17000 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17010 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
17020 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ;.    pPg->flags
17030 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
17040 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
17050 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
17060 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
17070 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
17080 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
17090 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
170a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
170b0 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
170c0 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
170d0 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
170e0 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
170f0 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
17100 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
17110 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
17120 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
17130 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
17140 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
17150 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
17160 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
17170 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
17180 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
17190 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
171a0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
171b0 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
171c0 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
171d0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
171e0 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
171f0 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61  Data, (u8*)aData
17200 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17210 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ze);.    pPager-
17220 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
17230 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
17240 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
17250 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
17260 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
17270 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
17280 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
17290 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
172a0 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
172b0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
172c0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
172d0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
172e0 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
172f0 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
17300 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
17310 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
17320 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
17330 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
17340 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
17350 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
17360 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
17370 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
17380 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
17390 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
173a0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a  tabase..      **
173b0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
173c0 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
173d0 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
173e0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
173f0 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
17400 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
17410 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
17420 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
17430 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
17440 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
17450 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
17460 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
17470 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
17480 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
17490 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
174a0 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
174b0 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
174c0 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
174d0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
174e0 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
174f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
17500 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
17510 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
17520 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
17530 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
17540 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
17550 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
17560 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
17570 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
17580 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
17590 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
175a0 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
175b0 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
175c0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
175d0 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
175e0 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
175f0 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
17600 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
17610 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
17620 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
17630 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
17640 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
17650 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
17660 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
17670 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
17680 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
17690 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
176a0 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
176b0 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
176c0 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
176d0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
176e0 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
176f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17700 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
17710 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
17720 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
17730 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
17740 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  g);.    }.    pa
17750 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
17760 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  (pPg);..    /* I
17770 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20  f this was page 
17780 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20  1, then restore 
17790 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
177a0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20  er.dbFileVers.. 
177b0 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65     ** Do this be
177c0 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e  fore any decodin
177d0 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  g. */.    if( pg
177e0 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d  no==1 ){.      m
177f0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
17800 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
17810 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a  *)pData)[24],siz
17820 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
17830 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
17840 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
17850 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61  he page just rea
17860 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20  d from disk */. 
17870 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
17880 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
17890 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
178a0 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c  _NOMEM);.    sql
178b0 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
178c0 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  e(pPg);.  }.  re
178d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
178e0 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
178f0 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
17900 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
17910 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
17920 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
17930 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
17940 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
17950 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
17960 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
17970 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
17980 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
17990 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
179a0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
179b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
179c0 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
179d0 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
179e0 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74  * Argument zMast
179f0 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  er may point to 
17a00 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e  Pager.pTmpSpace.
17a10 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20   So that buffer 
17a20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c  is not .** avail
17a30 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74  able for use wit
17a40 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
17a50 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  n..**.** When a 
17a60 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17a70 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
17a80 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  it is populated 
17a90 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a  with the names .
17aa0 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73  ** of all of its
17ab0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c   child journals,
17ac0 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68   one after anoth
17ad0 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73  er, formatted as
17ae0 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64   utf-8 .** encod
17af0 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64  ed text. The end
17b00 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a   of each child j
17b10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d  ournal file is m
17b20 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a  arked with a .**
17b30 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
17b40 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65  byte (0x00). i.e
17b50 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  . the entire con
17b60 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65  tents of a maste
17b70 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  r journal.** fil
17b80 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  e for a transact
17b90 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77  ion involving tw
17ba0 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68  o databases migh
17bb0 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f  t be:.**.**   "/
17bc0 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a  home/bill/a.db-j
17bd0 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f  ournal\x00/home/
17be0 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61  bill/b.db-journa
17bf0 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d  l\x00".**.** A m
17c00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17c10 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64  le may only be d
17c20 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20  eleted once all 
17c30 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a  of its child .**
17c40 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62   journals have b
17c50 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
17c60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
17c70 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63  tion reads the c
17c80 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
17c90 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
17ca0 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f  le into .** memo
17cb0 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72  ry and loops thr
17cc0 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65  ough each of the
17cd0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e   child journal n
17ce0 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63  ames. For.** eac
17cf0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c  h child journal,
17d00 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a   it checks if:.*
17d10 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  *.**   * if the 
17d20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78  child journal ex
17d30 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a  ists, and if so.
17d40 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
17d50 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  ild journal cont
17d60 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65  ains a reference
17d70 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   to master journ
17d80 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  al .**     file 
17d90 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66  zMaster.**.** If
17da0 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c   a child journal
17db0 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68   can be found th
17dc0 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20  at matches both 
17dd0 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  of the criteria.
17de0 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66  ** above, this f
17df0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
17e00 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
17e10 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73  ything. Otherwis
17e20 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  e, if.** no such
17e30 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
17e40 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c  an be found, fil
17e50 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c  e zMaster is del
17e60 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  eted from.** the
17e70 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69   file-system usi
17e80 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
17e90 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  te()..**.** If a
17ea0 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69  n IO error withi
17eb0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
17ec0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
17ed0 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
17ee0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
17ef0 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79  ocates memory by
17f00 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
17f10 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20  Malloc(). If an 
17f20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61  allocation.** fa
17f30 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
17f40 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  M is returned. O
17f50 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
17f60 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  IO or malloc err
17f70 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53  ors .** occur, S
17f80 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
17f90 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  rned..**.** TODO
17fa0 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
17fb0 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67  allocates a sing
17fc0 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  le block of memo
17fd0 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68  ry to load.** th
17fe0 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
17ff0 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
18000 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
18010 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  is could be.** a
18020 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62   couple of kilob
18030 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74  ytes or so - pot
18040 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20  entially larger 
18050 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a  than the page .*
18060 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  * size..*/.stati
18070 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
18080 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
18090 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
180a0 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
180b0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
180c0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
180d0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
180e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
180f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
18100 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
18110 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c  ster;    /* Mall
18120 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72  oc'd master-jour
18130 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
18140 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tor */.  sqlite3
18150 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b  _file *pJournal;
18160 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63     /* Malloc'd c
18170 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild-journal fil
18180 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
18190 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
181a0 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
181b0 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
181c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
181d0 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
181e0 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
181f0 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
18200 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18210 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
18220 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
18230 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f  ointer to one jo
18240 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20  urnal within MJ 
18250 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
18260 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20  zMasterPtr;     
18270 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
18280 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65  hold MJ filename
18290 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20   from a journal 
182a0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  file */.  int nM
182b0 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
182c0 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
182d0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
182e0 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d   to zMasterPtr[]
182f0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
18300 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74  te space for bot
18310 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61  h the pJournal a
18320 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20  nd pMaster file 
18330 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a  descriptors..  *
18340 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
18350 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   open the master
18360 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
18370 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a  r reading..  */.
18380 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
18390 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
183a0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56  te3MallocZero(pV
183b0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
183c0 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
183d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
183e0 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
183f0 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
18400 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
18410 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
18420 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
18430 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
18440 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
18450 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
18460 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
18470 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  STER_JOURNAL);. 
18480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18490 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73  sOpen(pVfs, zMas
184a0 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c  ter, pMaster, fl
184b0 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ags, 0);.  }.  i
184c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
184d0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
184e0 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  r_out;..  /* Loa
184f0 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
18500 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18510 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
18520 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73  ined from.  ** s
18530 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
18540 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  and pointed to b
18550 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  y zMasterJournal
18560 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a  .   Also obtain.
18570 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20    ** sufficient 
18580 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65  space (in zMaste
18590 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68  rPtr) to hold th
185a0 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65  e names of maste
185b0 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  r.  ** journal f
185c0 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20 66  iles extracted f
185d0 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c  rom regular roll
185e0 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20  back-journals.. 
185f0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
18600 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61  e3OsFileSize(pMa
18610 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
18620 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
18630 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
18640 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18650 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  ;.  nMasterPtr =
18660 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
18670 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f  e+1;.  zMasterJo
18680 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d  urnal = sqlite3M
18690 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74  alloc((int)nMast
186a0 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
186b0 74 65 72 50 74 72 20 2b 20 32 29 3b 0a 20 20 69  terPtr + 2);.  i
186c0 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
186d0 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
186e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
186f0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18700 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  out;.  }.  zMast
18710 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
18720 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
18730 6f 75 72 6e 61 6c 2b 32 5d 3b 0a 20 20 72 63 20  ournal+2];.  rc 
18740 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
18750 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
18760 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
18770 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
18780 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18790 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
187a0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f  master_out;..  /
187b0 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 65 76  * Ensure that ev
187c0 65 6e 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e  en if the conten
187d0 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
187e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72   journal file ar
187f0 65 20 63 6f 72 72 75 70 74 2c 0a 20 20 2a 2a 20  e corrupt,.  ** 
18800 74 68 65 79 20 61 72 65 20 74 65 72 6d 69 6e 61  they are termina
18810 74 65 64 20 62 79 20 61 20 70 61 69 72 20 6f 66  ted by a pair of
18820 20 30 78 30 30 20 62 79 74 65 73 2e 20 54 68 69   0x00 bytes. Thi
18830 73 20 70 72 65 76 65 6e 74 73 20 62 75 66 66 65  s prevents buffe
18840 72 20 0a 20 20 2a 2a 20 6f 76 65 72 72 65 61 64  r .  ** overread
18850 73 20 69 6e 20 61 6e 79 20 63 61 6c 6c 73 20 6d  s in any calls m
18860 61 64 65 20 74 6f 20 73 71 6c 69 74 65 33 5f 75  ade to sqlite3_u
18870 72 69 5f 78 78 78 28 29 20 76 69 61 20 73 71 6c  ri_xxx() via sql
18880 69 74 65 33 4f 73 4f 70 65 6e 28 29 0a 20 20 2a  ite3OsOpen().  *
18890 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 7a  * below.  */.  z
188a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
188b0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
188c0 30 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  0;.  zMasterJour
188d0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
188e0 61 6c 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a  al+1] = 0;..  zJ
188f0 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
18900 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65  Journal;.  while
18910 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
18920 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
18930 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
18940 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 69 6e    char c;.    in
18950 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 69 6e  t exists;.    in
18960 74 20 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  t nJournal = sql
18970 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f  ite3Strlen30(zJo
18980 75 72 6e 61 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  urnal);..    /* 
18990 54 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  The sqlite3OsAcc
189a0 65 73 73 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ess() and sqlite
189b0 33 4f 73 4f 70 65 6e 28 29 20 66 75 6e 63 74 69  3OsOpen() functi
189c0 6f 6e 73 20 72 65 71 75 69 72 65 20 61 72 67 75  ons require argu
189d0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 73 74 72 69  ment.    ** stri
189e0 6e 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ngs that may be 
189f0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71  passed to the sq
18a00 6c 69 74 65 33 5f 75 72 69 5f 78 78 78 28 29 20  lite3_uri_xxx() 
18a10 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  API functions.. 
18a20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
18a30 73 65 20 74 68 61 74 20 6d 65 61 6e 73 20 73 74  se that means st
18a40 72 69 6e 67 73 20 74 65 72 6d 69 6e 61 74 65 64  rings terminated
18a50 20 62 79 20 61 20 70 61 69 72 20 6f 66 20 30 78   by a pair of 0x
18a60 30 30 20 62 79 74 65 73 2e 0a 20 20 20 20 2a 2a  00 bytes..    **
18a70 20 42 75 74 20 74 68 65 20 6d 61 73 74 65 72 2d   But the master-
18a80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
18a90 74 61 69 6e 73 20 73 74 72 69 6e 67 73 20 74 65  tains strings te
18aa0 72 6d 69 6e 61 74 65 64 20 62 79 20 61 20 73 69  rminated by a si
18ab0 6e 67 6c 65 0a 20 20 20 20 2a 2a 20 30 78 30 30  ngle.    ** 0x00
18ac0 20 6f 6e 6c 79 2e 20 53 6f 20 74 65 6d 70 6f 72   only. So tempor
18ad0 61 72 69 6c 79 20 72 65 70 6c 61 63 65 20 74 68  arily replace th
18ae0 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
18af0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
18b00 20 20 2a 2a 20 73 74 72 69 6e 67 20 77 69 74 68    ** string with
18b10 20 61 20 73 65 63 6f 6e 64 20 30 78 30 30 2e 20   a second 0x00. 
18b20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c  The original val
18b30 75 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 62  ue is restored b
18b40 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
18b50 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
18b60 6f 66 20 74 68 69 73 20 6c 6f 6f 70 2e 20 20 2a  of this loop.  *
18b70 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 7a  /.    assert( &z
18b80 4a 6f 75 72 6e 61 6c 5b 6e 4a 6f 75 72 6e 61 6c  Journal[nJournal
18b90 2b 31 5d 20 3c 20 7a 4d 61 73 74 65 72 50 74 72  +1] < zMasterPtr
18ba0 20 29 3b 0a 20 20 20 20 63 20 3d 20 7a 4a 6f 75   );.    c = zJou
18bb0 72 6e 61 6c 5b 6e 4a 6f 75 72 6e 61 6c 2b 31 5d  rnal[nJournal+1]
18bc0 3b 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 5b 6e  ;.    zJournal[n
18bd0 4a 6f 75 72 6e 61 6c 2b 31 5d 20 3d 20 27 5c 30  Journal+1] = '\0
18be0 27 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ';..    rc = sql
18bf0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
18c00 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  s, zJournal, SQL
18c10 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
18c20 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20  S, &exists);.   
18c30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18c40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
18c50 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18c60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78      }.    if( ex
18c70 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ists ){.      /*
18c80 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
18c90 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
18ca0 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
18cb0 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
18cc0 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
18cd0 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
18ce0 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
18cf0 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
18d00 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
18d10 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
18d20 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
18d30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
18d40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
18d50 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
18d60 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
18d70 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
18d80 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
18d90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
18da0 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  en(pVfs, zJourna
18db0 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61  l, pJournal, fla
18dc0 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  gs, 0);.      if
18dd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18de0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
18df0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
18e00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63       }..      rc
18e10 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
18e20 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
18e30 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
18e40 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71  erPtr);.      sq
18e50 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f  lite3OsClose(pJo
18e60 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  urnal);.      if
18e70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18e80 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
18e90 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
18ea0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
18eb0 28 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21  ( zMasterPtr[0]!
18ec0 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
18ed0 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
18ee0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
18ef0 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
18f00 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
18f10 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
18f20 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
18f30 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
18f40 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
18f50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75  }.    }.    zJou
18f60 72 6e 61 6c 20 2b 3d 20 6e 4a 6f 75 72 6e 61 6c  rnal += nJournal
18f70 2b 31 3b 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  +1;.    zJournal
18f80 5b 30 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 0a 20  [0] = c;.  }. . 
18f90 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
18fa0 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d  pMaster);.  rc =
18fb0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
18fc0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
18fd0 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f  0);..delmaster_o
18fe0 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ut:.  sqlite3_fr
18ff0 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
19000 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65  l);.  if( pMaste
19010 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
19020 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
19030 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  ;.    assert( !i
19040 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20  sOpen(pJournal) 
19050 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
19060 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
19070 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19080 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
19090 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
190a0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63 74  o change the act
190b0 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ual size of the 
190c0 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
190d0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
190e0 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20  stem. This only 
190f0 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d  happens when com
19100 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
19110 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c  ction,.** or rol
19120 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e  ling back a tran
19130 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69  saction (includi
19140 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ng rolling back 
19150 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a  a hot-journal)..
19160 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69  **.** If the mai
19170 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
19180 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20  is not open, or 
19190 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
191a0 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42   in either.** DB
191b0 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  MOD or OPEN stat
191c0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
191d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
191e0 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65  erwise, the size
191f0 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65   .** of the file
19200 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e   is changed to n
19210 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67  Page pages (nPag
19220 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e*pPager->pageSi
19230 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49  ze bytes). .** I
19240 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
19250 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  sk is currently 
19260 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67  larger than nPag
19270 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73  e pages, then us
19280 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72  e the VFS.** xTr
19290 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20  uncate() method 
192a0 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a  to truncate it..
192b0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67  **.** Or, it mig
192c0 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  ht might be the 
192d0 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69  case that the fi
192e0 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d  le on disk is sm
192f0 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e  aller than .** n
19300 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65  Page pages. Some
19310 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
19320 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  m implementation
19330 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73  s can get confus
19340 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72  ed if .** you tr
19350 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20  y to truncate a 
19360 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a  file to some siz
19370 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  e that is larger
19380 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72   than it .** cur
19390 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65  rently is, so de
193a0 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
193b0 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  nd write a singl
193c0 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a  e zero byte to .
193d0 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
193e0 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65  e new file inste
193f0 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ad..**.** If suc
19400 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
19410 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
19420 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
19430 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67   while modifying
19440 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
19450 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68   file, return th
19460 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
19470 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
19480 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
19490 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
194a0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
194b0 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
194c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
194d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
194e0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
194f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19500 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
19510 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
19520 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
19530 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26  ager->fd) .   &&
19540 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
19550 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
19560 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
19570 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
19580 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36  EN) .  ){.    i6
19590 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
195a0 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20  ewSize;.    int 
195b0 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
195c0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61  >pageSize;.    a
195d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
195e0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
195f0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54  LOCK );.    /* T
19600 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20  ODO: Is it safe 
19610 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46  to use Pager.dbF
19620 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f  ileSize here? */
19630 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19640 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
19650 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
19660 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
19670 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34  ze = szPage*(i64
19680 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
19690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
196a0 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
196b0 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
196c0 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
196d0 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
196e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
196f0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
19700 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
19710 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19720 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d      char *pTmp =
19730 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
19740 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  ce;.        mems
19750 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61  et(pTmp, 0, szPa
19760 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  ge);.        tes
19770 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d  tcase( (newSize-
19780 73 7a 50 61 67 65 29 20 3c 20 20 63 75 72 72 65  szPage) <  curre
19790 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
197a0 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
197b0 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20  Size-szPage) == 
197c0 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
197d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
197e0 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
197f0 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65  ) >  currentSize
19800 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
19810 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
19820 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70  pPager->fd, pTmp
19830 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a  , szPage, newSiz
19840 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  e-szPage);.     
19850 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
19860 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19870 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
19880 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
19890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
198a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
198b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
198c0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
198d0 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
198e0 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65  variable for the
198f0 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20   given.** pager 
19900 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c  based on the val
19910 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
19920 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d  he xSectorSize m
19930 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20  ethod.** of the 
19940 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
19950 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73  le. The sector s
19960 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ize will be used
19970 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74   used .** to det
19980 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
19990 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  and alignment of
199a0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
199b0 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  and .** master j
199c0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
199d0 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a  within created j
199e0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
199f0 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
19a00 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65  y files the effe
19a10 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
19a20 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20  e is always 512 
19a30 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bytes..**.** Oth
19a40 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d  erwise, for non-
19a50 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
19a60 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
19a70 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a  ector size is.**
19a80 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
19a90 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
19aa0 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20  orSize() method 
19ab0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32  rounded up to 32
19ac0 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73   if.** it is les
19ad0 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f  s than 32, or ro
19ae0 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41  unded down to MA
19af0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66  X_SECTOR_SIZE if
19b00 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65   it.** is greate
19b10 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f  r than MAX_SECTO
19b20 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  R_SIZE..**.** If
19b30 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68   the file has th
19b40 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  e SQLITE_IOCAP_P
19b50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
19b60 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  TE property, the
19b70 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66  n set.** the eff
19b80 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
19b90 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75  ze to its minimu
19ba0 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20  m value (512).  
19bb0 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a  The purpose of.*
19bc0 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  * pPager->sector
19bd0 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e  Size is to defin
19be0 65 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64  e the "blast rad
19bf0 69 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68  ius" of bytes th
19c00 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
19c10 67 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63  ge if a crash oc
19c20 63 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69  curs while writi
19c30 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62  ng to a single b
19c40 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72  yte in.** that r
19c50 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20  ange.  But with 
19c60 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
19c70 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72  ITE, the blast r
19c80 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a  adius is zero.**
19c90 20 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50   (that is what P
19ca0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
19cb0 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65  TE means), so we
19cc0 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65   minimize the se
19cd0 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46  ctor.** size.  F
19ce0 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
19cf0 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68  patibility of th
19d00 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
19d10 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a  al file format,.
19d20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64  ** we cannot red
19d30 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76  uce the effectiv
19d40 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65  e sector size be
19d50 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74  low 512..*/.stat
19d60 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
19d70 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
19d80 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
19d90 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
19da0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
19db0 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
19dc0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
19dd0 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  e.   || (sqlite3
19de0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
19df0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
19e00 66 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20  fd) & .         
19e10 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
19e20 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
19e30 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20  WRITE)!=0.  ){. 
19e40 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
19e50 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
19e60 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
19e70 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
19e80 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
19e90 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
19ea0 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69  ened yet, in whi
19eb0 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ch case the OsSe
19ec0 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
19ed0 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
19ee0 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ault. */.    pPa
19ef0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
19f00 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 512;.  }else{.
19f10 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
19f20 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
19f30 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
19f40 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 66  ger->fd);.    if
19f50 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
19f60 53 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20 20  Size<32 ){.     
19f70 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
19f80 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 7d  ize = 512;.    }
19f90 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
19fa0 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  >sectorSize>MAX_
19fb0 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20  SECTOR_SIZE ){. 
19fc0 20 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58       assert( MAX
19fd0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31  _SECTOR_SIZE>=51
19fe0 32 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  2 );.      pPage
19ff0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
1a000 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  MAX_SECTOR_SIZE;
1a010 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1a020 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
1a030 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
1a040 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
1a050 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
1a060 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
1a070 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
1a080 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
1a090 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
1a0a0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1a0b0 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
1a0c0 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
1a0d0 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
1a0e0 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
1a0f0 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
1a100 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
1a110 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1a120 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
1a130 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
1a140 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
1a150 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
1a160 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
1a170 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1a180 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
1a190 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
1a1a0 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
1a1b0 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
1a1c0 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
1a1d0 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
1a1e0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1a1f0 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
1a200 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
1a210 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
1a220 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
1a230 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
1a240 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1a250 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1a260 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
1a270 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
1a280 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
1a290 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
1a2a0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1a2b0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1a2c0 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
1a2d0 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
1a2e0 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
1a2f0 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
1a300 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
1a310 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1a320 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1a330 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  is the page size
1a340 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20  ..**  (7)  zero 
1a350 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74  padding out to t
1a360 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73  he next sector s
1a370 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65  ize..**  (8)  Ze
1a380 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  ro or more pages
1a390 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68   instances, each
1a3a0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
1a3b0 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
1a3c0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1a3d0 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65          +  pPage
1a3e0 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
1a3f0 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20  s of data..**   
1a400 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63       +  4 byte c
1a410 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68  hecksum.**.** Wh
1a420 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74  en we speak of t
1a430 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1a440 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66  r, we mean the f
1a450 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f  irst 7 items abo
1a460 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  ve..** Each entr
1a470 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
1a480 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
1a490 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e  of the 8th item.
1a4a0 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
1a4b0 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73  value from the s
1a4c0 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52  econd bullet "nR
1a4d0 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68  ec".  nRec is th
1a4e0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76  e number of.** v
1a4f0 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65  alid page entrie
1a500 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1a510 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  .  In most cases
1a520 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74  , you can comput
1a530 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  e the.** value o
1a540 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20  f nRec from the 
1a550 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1a560 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69  nal file.  But i
1a570 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  f a power.** fai
1a580 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
1a590 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
1a5a0 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65  was being writte
1a5b0 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  n, it could be t
1a5c0 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20  he.** case that 
1a5d0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1a5e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64  journal file had
1a5f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
1a600 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74  creased but.** t
1a610 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73  he extra entries
1a620 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64   had not yet mad
1a630 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64  e it safely to d
1a640 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20  isk.  In such a 
1a650 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c  case,.** the val
1a660 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75  ue of nRec compu
1a670 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
1a680 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20  e size would be 
1a690 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a  too large.  For.
1a6a0 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  ** that reason, 
1a6b0 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
1a6c0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20  e nRec value in 
1a6d0 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a  the header..**.*
1a6e0 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61  * If the nRec va
1a6f0 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1a700 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  f it means that 
1a710 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63  nRec should be c
1a720 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  omputed.** from 
1a730 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20  the file size.  
1a740 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73  This value is us
1a750 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
1a760 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20   selects the.** 
1a770 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66  no-sync option f
1a780 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  or the journal. 
1a790 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   A power failure
1a7a0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63   could lead to c
1a7b0 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20  orruption.** in 
1a7c0 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20  this case.  But 
1a7d0 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20  for things like 
1a7e0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1a7f0 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a  (which will be.*
1a800 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  * deleted when t
1a810 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  he power is rest
1a820 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63  ored) we don't c
1a830 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  are.  .**.** If 
1a840 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
1a850 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
1a860 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
1a870 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
1a880 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c  nal file then al
1a890 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68  l pages up to th
1a8a0 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65  e first corrupte
1a8b0 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65  d page are rolle
1a8c0 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f  d.** back (or no
1a8d0 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f   pages if the jo
1a8e0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
1a8f0 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20  corrupted). The 
1a900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
1a910 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20  is then deleted 
1a920 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1a930 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20  turned, just as 
1a940 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e  if no corruption
1a950 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63   had.** been enc
1a960 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  ountered..**.** 
1a970 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c  If an I/O or mal
1a980 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
1a990 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  rs, the journal-
1a9a0 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
1a9b0 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ted.** and an er
1a9c0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1a9d0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
1a9e0 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20  isHot parameter 
1a9f0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77  indicates that w
1aa00 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
1aa10 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e  rollback a journ
1aa20 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74  al.** that might
1aa30 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   be a hot journa
1aa40 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64  l.  Or, it could
1aa50 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75   be that the jou
1aa60 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73  rnal is .** pres
1aa70 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66  erved because of
1aa80 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52   JOURNALMODE_PER
1aa90 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d  SIST or JOURNALM
1aaa0 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a  ODE_TRUNCATE..**
1aab0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1aac0 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72  really is hot, r
1aad0 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63  eset the pager c
1aae0 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69  ache prior rolli
1aaf0 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63  ng.** back any c
1ab00 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20  ontent.  If the 
1ab10 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c  journal is merel
1ab20 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f  y persistent, no
1ab30 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65   reset is.** nee
1ab40 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
1ab50 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
1ab60 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
1ab70 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73   int isHot){.  s
1ab80 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1ab90 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
1aba0 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1abc0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1abd0 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
1abe0 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ac00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
1ac10 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
1ac20 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
1ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac40 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1ac50 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
1ac60 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
1ac70 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1ac80 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
1ac90 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
1aca0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1acc0 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
1acd0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1ace0 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
1acf0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1ad00 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
1ad10 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
1ad20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
1ad30 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
1ad40 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
1ad50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
1ad60 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65  any */.  int nee
1ad70 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20  dPagerReset;    
1ad80 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
1ad90 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f  et page prior to
1ada0 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c   first page roll
1adb0 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  back */..  /* Fi
1adc0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1add0 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
1ade0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1adf0 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
1ae00 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
1ae10 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
1ae20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1ae30 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
1ae40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1ae50 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1ae60 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
1ae70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ae80 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1ae90 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
1aea0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
1aeb0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
1aec0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1aed0 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
1aee0 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
1aef0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1af00 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
1af10 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
1af20 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
1af30 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
1af40 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1af50 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
1af60 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1af70 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
1af80 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
1af90 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c  TODO: Technicall
1afa0 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
1afb0 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  is an error beca
1afc0 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74  use it assumes t
1afd0 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  hat.  ** buffer 
1afe0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1aff0 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31  is (mxPathname+1
1b000 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65  ) bytes or large
1b010 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a  r. i.e. that.  *
1b020 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  * (pPager->pageS
1b030 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70  ize >= pPager->p
1b040 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1b050 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69  1). Using os_uni
1b060 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74  x.c,.  **  mxPat
1b070 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68  hname is 512, wh
1b080 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20  ich is the same 
1b090 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61  as the minimum a
1b0a0 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20  llowable value. 
1b0b0 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65   ** for pageSize
1b0c0 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  ..  */.  zMaster
1b0d0 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1b0e0 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61  pace;.  rc = rea
1b0f0 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1b100 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1b110 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1b120 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1b130 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1b140 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1b150 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [0] ){.    rc = 
1b160 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1b170 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
1b180 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1b190 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a  STS, &res);.  }.
1b1a0 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
1b1b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b1c0 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20  OK || !res ){.  
1b1d0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1b1e0 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
1b1f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1b200 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65  0;.  needPagerRe
1b210 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20  set = isHot;..  
1b220 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
1b230 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
1b240 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61  hen a readJourna
1b250 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20  lHdr() or .  ** 
1b260 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1b270 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72  ne_page() call r
1b280 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1b290 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
1b2a0 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20  r .  ** occurs. 
1b2b0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  .  */.  while( 1
1b2c0 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20   ){.    /* Read 
1b2d0 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
1b2e0 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
1b2f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1b300 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
1b310 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
1b320 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
1b330 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1b340 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
1b350 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
1b360 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
1b370 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
1b380 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
1b390 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
1b3a0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
1b3b0 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
1b3c0 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
1b3d0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
1b3e0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
1b3f0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
1b400 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c  ger, isHot, szJ,
1b410 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
1b420 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b430 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
1b440 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1b450 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
1b460 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1b480 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1b490 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1b4a0 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
1b4b0 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
1b4c0 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
1b4d0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
1b4e0 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
1b4f0 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
1b500 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1b510 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
1b520 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
1b530 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
1b540 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
1b550 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
1b560 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
1b570 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
1b580 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
1b590 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
1b5a0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1b5b0 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
1b5c0 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
1b5d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1b5e0 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1b5f0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1b600 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
1b610 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
1b620 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b630 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
1b640 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
1b650 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1b660 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
1b670 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
1b680 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
1b690 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
1b6a0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
1b6b0 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
1b6c0 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
1b6d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
1b6e0 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
1b6f0 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
1b700 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1b710 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
1b720 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
1b730 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
1b740 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
1b750 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
1b760 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
1b770 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
1b780 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
1b790 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
1b7a0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
1b7b0 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
1b7c0 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
1b7d0 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
1b7e0 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
1b7f0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
1b800 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
1b810 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
1b820 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
1b830 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
1b840 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
1b850 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
1b860 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1b870 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
1b880 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
1b890 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
1b8a0 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
1b8b0 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
1b8c0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1b8d0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1b8e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1b8f0 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
1b900 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
1b910 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1b920 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
1b930 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
1b940 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
1b950 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
1b960 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
1b970 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b980 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1b990 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
1b9a0 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
1b9b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1b9c0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
1b9d0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
1b9e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1b9f0 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
1ba00 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
1ba10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
1ba20 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
1ba30 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1ba40 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1ba50 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
1ba60 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
1ba70 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
1ba80 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
1ba90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
1baa0 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
1bab0 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
1bac0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1bad0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
1bae0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1baf0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
1bb00 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
1bb10 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
1bb20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1bb30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bb40 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1bb50 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
1bb60 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1bb70 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
1bb80 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
1bb90 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
1bba0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1bbb0 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
1bbc0 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
1bbd0 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61  e file and/or pa
1bbe0 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  ge cache..    */
1bbf0 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  .    for(u=0; u<
1bc00 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  nRec; u++){.    
1bc10 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52    if( needPagerR
1bc20 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  eset ){.        
1bc30 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1bc40 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65  er);.        nee
1bc50 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b  dPagerReset = 0;
1bc60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1bc70 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1bc80 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
1bc90 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er,&pPager->jour
1bca0 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20  nalOff,0,1,0);. 
1bcb0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1bcc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bcd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bce0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1bcf0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1bd00 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
1bd10 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1bd20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1bd30 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1bd40 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1bd50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1bd60 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
1bd70 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73  een truncated, s
1bd80 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69  imply stop readi
1bd90 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ng and.         
1bda0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74   ** processing t
1bdb0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73  he journal. This
1bdc0 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66   might happen if
1bdd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1bde0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  .          ** no
1bdf0 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69  t completely wri
1be00 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20  tten and synced 
1be10 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68  prior to a crash
1be20 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20  .  In that.     
1be30 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68       ** case, th
1be40 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
1be50 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65  d have never bee
1be60 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65  n written in the
1be70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
1be80 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20  rst place so it 
1be90 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20  is OK to simply 
1bea0 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c  abandon the roll
1beb0 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  back. */.       
1bec0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1bed0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1bee0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1bef0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1bf00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
1bf10 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1bf20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61  rollback, quit a
1bf30 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
1bf40 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ror.          **
1bf50 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c   code.  This wil
1bf60 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65  l cause the page
1bf70 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
1bf80 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20  rror state.     
1bf90 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
1bfa0 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20  no further harm 
1bfb0 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50  will be done.  P
1bfc0 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a  erhaps the next.
1bfd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1bfe0 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
1bff0 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  ng will be able 
1c000 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1c010 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
1c020 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1c030 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1c040 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
1c050 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c060 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
1c070 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
1c080 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
1c090 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20   /* Following a 
1c0a0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61  rollback, the da
1c0b0 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1c0c0 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74  ld be back in it
1c0d0 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
1c0e0 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74  state prior to t
1c0f0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1c100 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20  transaction, so 
1c110 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  invoke the.  ** 
1c120 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1c130 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63  UNCHANGED file-c
1c140 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f  ontrol method to
1c150 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a   disable the.  *
1c160 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74  * assertion that
1c170 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1c180 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64   counter was mod
1c190 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64  ified..  */.#ifd
1c1a0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c1b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64    if( pPager->fd
1c1c0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
1c1d0 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
1c1e0 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
1c1f0 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
1c200 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
1c210 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
1c220 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61    /* If this pla
1c230 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69  yback is happeni
1c240 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ng automatically
1c250 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
1c260 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d  an IO or .  ** m
1c270 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74  alloc error that
1c280 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20   occurred after 
1c290 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1c2a0 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62  er was updated b
1c2b0 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20  ut .  ** before 
1c2c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1c2d0 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  was committed, t
1c2e0 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hen the change-c
1c2f0 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64  ounter .  ** mod
1c300 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75  ification may ju
1c310 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76  st have been rev
1c320 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68  erted. If this h
1c330 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73  appens in exclus
1c340 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20  ive .  ** mode, 
1c350 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
1c360 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72  transactions per
1c370 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f  formed by the co
1c380 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f  nnection will no
1c390 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68  t.  ** update th
1c3a0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1c3b0 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61   at all. This ma
1c3c0 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20  y lead to cache 
1c3d0 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20  inconsistency.  
1c3e0 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  ** problems for 
1c3f0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
1c400 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
1c410 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c   the future. So,
1c420 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61   just.  ** in ca
1c430 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70  se this has happ
1c440 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20  ened, clear the 
1c450 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1c460 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  flag now..  */. 
1c470 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
1c480 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
1c490 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
1c4a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c4b0 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
1c4c0 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1c4d0 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
1c4e0 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1c4f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
1c500 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
1c510 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1c520 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
1c530 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c540 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1c550 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
1c560 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
1c570 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
1c580 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
1c590 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1c5a0 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  EN).  ){.    rc 
1c5b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  = sqlite3PagerSy
1c5c0 6e 63 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  nc(pPager);.  }.
1c5d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c5e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1c5f0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
1c600 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
1c610 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
1c620 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1c630 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1c640 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1c650 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1c660 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
1c670 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1c680 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
1c690 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
1c6a0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
1c6b0 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
1c6c0 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
1c6d0 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
1c6e0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
1c6f0 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
1c700 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
1c710 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
1c720 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
1c730 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1c740 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
1c750 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
1c760 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
1c770 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
1c780 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
1c790 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
1c7a0 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
1c7b0 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
1c7c0 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
1c7d0 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
1c7e0 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
1c7f0 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1c800 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
1c810 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
1c820 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1c830 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c840 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
1c850 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
1c860 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1c870 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c880 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
1c890 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1c8a0 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1c8b0 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1c8c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1c8d0 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1c8e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c8f0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1c900 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1c910 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1c920 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1c930 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1c940 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1c950 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1c960 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1c970 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1c980 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1c990 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1c9a0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1c9b0 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1c9c0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1c9d0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1c9e0 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1c9f0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1ca00 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1ca10 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
1ca20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
1ca30 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1ca40 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
1ca50 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
1ca60 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
1ca70 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
1ca80 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1ca90 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1caa0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1cab0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61   */.  int isInWa
1cac0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
1cad0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61     /* True if pa
1cae0 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c  ge is in log fil
1caf0 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1cb00 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1cb10 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1cb20 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1cb30 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1cb40 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1cb50 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1cb60 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1cb70 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1cb80 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  fd) );..  if( NE
1cb90 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67  VER(!isOpen(pPag
1cba0 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
1cbb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cbc0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1cbd0 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
1cbe0 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
1cbf0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74  geSize);.    ret
1cc00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1cc10 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
1cc20 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
1cc30 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70  .    /* Try to p
1cc40 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f  ull the page fro
1cc50 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  m the write-ahea
1cc60 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63  d log. */.    rc
1cc70 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61   = sqlite3WalRea
1cc80 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  d(pPager->pWal, 
1cc90 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20  pgno, &isInWal, 
1cca0 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61  pgsz, pPg->pData
1ccb0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1ccc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69  =SQLITE_OK && !i
1ccd0 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36  sInWal ){.    i6
1cce0 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
1ccf0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1cd00 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1cd10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1cd20 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1cd30 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
1cd40 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1cd50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1cd60 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1cd70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1cd80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1cd90 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
1cda0 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
1cdb0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1cdc0 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
1cdd0 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1cde0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
1cdf0 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
1ce00 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
1ce10 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
1ce20 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
1ce30 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
1ce40 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
1ce50 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
1ce60 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
1ce70 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
1ce80 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
1ce90 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
1cea0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1ceb0 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
1cec0 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
1ced0 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
1cee0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
1cef0 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
1cf00 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
1cf10 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
1cf20 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
1cf30 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
1cf40 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
1cf50 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
1cf60 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1cf70 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
1cf80 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
1cf90 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
1cfa0 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
1cfb0 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
1cfc0 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1cfd0 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
1cfe0 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
1cff0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
1d000 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
1d010 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36  sing equaling 16
1d020 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69   bytes of 0xff i
1d030 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  s vanishingly sm
1d040 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20  all so.      ** 
1d050 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20  we should still 
1d060 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  be ok..      */.
1d070 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
1d080 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1d090 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50   0xff, sizeof(pP
1d0a0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d0b0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
1d0c0 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56       u8 *dbFileV
1d0d0 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67  ers = &((u8*)pPg
1d0e0 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20  ->pData)[24];.  
1d0f0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1d100 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1d110 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
1d120 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1d130 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20  eVers));.    }. 
1d140 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
1d150 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
1d160 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51  pgno, 3, rc = SQ
1d170 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20  LITE_NOMEM);..  
1d180 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1d190 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
1d1a0 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
1d1b0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
1d1c0 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
1d1d0 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
1d1e0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1d1f0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
1d200 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
1d210 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1d220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1d230 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1d240 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
1d250 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
1d260 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d270 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76 61  ** Update the va
1d280 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67  lue of the chang
1d290 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66  e-counter at off
1d2a0 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20 69  sets 24 and 92 i
1d2b0 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  n.** the header 
1d2c0 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20 76  and the sqlite v
1d2d0 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74  ersion number at
1d2e0 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a   offset 96..**.*
1d2f0 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63  * This is an unc
1d300 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74  onditional updat
1d310 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65  e.  See also the
1d320 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1d330 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72  gecounter().** r
1d340 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c  outine which onl
1d350 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1d360 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20  ange-counter if 
1d370 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61 63  the update is ac
1d380 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64  tually.** needed
1d390 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20  , as determined 
1d3a0 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63  by the pPager->c
1d3b0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73  hangeCountDone s
1d3c0 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a  tate variable..*
1d3d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
1d3e0 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
1d3f0 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70  counter(PgHdr *p
1d400 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67  Pg){.  u32 chang
1d410 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a  e_counter;..  /*
1d420 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
1d430 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
1d440 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
1d450 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
1d460 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
1d470 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
1d480 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61  te((u8*)pPg->pPa
1d490 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1d4a0 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  +1;.  put32bits(
1d4b0 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1d4c0 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
1d4d0 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41  ounter);..  /* A
1d4e0 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51  lso store the SQ
1d4f0 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  Lite version num
1d500 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e  ber in bytes 96.
1d510 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20  .99 and in.  ** 
1d520 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f  bytes 92..95 sto
1d530 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  re the change co
1d540 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20  unter for which 
1d550 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  the version numb
1d560 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64  er.  ** is valid
1d570 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
1d580 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1d590 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f  ata)+92, change_
1d5a0 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33  counter);.  put3
1d5b0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1d5c0 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51  g->pData)+96, SQ
1d5d0 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
1d5e0 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  BER);.}..#ifndef
1d5f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1d600 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1d610 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
1d620 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61  once for each pa
1d630 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  ge that has alre
1d640 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69  ady been .** wri
1d650 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f  tten into the lo
1d660 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41  g file when a WA
1d670 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
1d680 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
1d690 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69   Parameter iPg i
1d6a0 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1d6b0 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20  r of said page. 
1d6c0 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e  The pCtx argumen
1d6d0 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c  t .** is actuall
1d6e0 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
1d6f0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1d700 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  re..**.** If pag
1d710 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74  e iPg is present
1d720 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61   in the cache, a
1d730 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  nd has no outsta
1d740 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
1d750 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61  ,.** it is disca
1d760 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rded. Otherwise,
1d770 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e   if there are on
1d780 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61  e or more outsta
1d790 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e  nding.** referen
1d7a0 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f  ces, the page co
1d7b0 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65  ntent is reloade
1d7c0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1d7d0 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61  ase. If the.** a
1d7e0 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64  ttempt to reload
1d7f0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1d800 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
1d810 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73  quired and fails
1d820 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  , .** return an 
1d830 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1d840 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
1d850 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
1d860 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f  ic int pagerUndo
1d870 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
1d880 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a  Ctx, Pgno iPg){.
1d890 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d8a0 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1d8b0 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
1d8c0 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a  )pCtx;.  PgHdr *
1d8d0 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71  pPg;..  pPg = sq
1d8e0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1d8f0 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20  (pPager, iPg);. 
1d900 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
1d910 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
1d920 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
1d930 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  g)==1 ){.      s
1d940 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
1d950 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
1d960 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
1d970 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
1d980 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d990 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d9a0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1d9b0 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  er(pPg);.      }
1d9c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1d9d0 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1d9e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
1d9f0 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72  ormally, if a tr
1da00 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1da10 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61  led back, any ba
1da20 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61  ckup processes a
1da30 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  re.  ** updated 
1da40 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65  as data is copie
1da50 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c  d out of the rol
1da60 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
1da70 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  d into the.  ** 
1da80 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
1da90 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20  s not generally 
1daa0 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20  possible with a 
1dab0 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73  WAL database, as
1dac0 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69  .  ** rollback i
1dad0 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74  nvolves simply t
1dae0 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f  runcating the lo
1daf0 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  g file. Therefor
1db00 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f  e, if one.  ** o
1db10 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61  r more frames ha
1db20 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1db30 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
1db40 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  og (and therefor
1db50 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70  e .  ** also cop
1db60 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63  ied into the bac
1db70 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61  kup databases) a
1db80 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  s part of this t
1db90 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a  ransaction,.  **
1dba0 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73   the backups mus
1dbb0 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  t be restarted..
1dbc0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61    */.  sqlite3Ba
1dbd0 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
1dbe0 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20  er->pBackup);.. 
1dbf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1dc00 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1dc10 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1dc20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  rollback a trans
1dc30 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20  action on a WAL 
1dc40 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1dc50 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c  tic int pagerRol
1dc60 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a  lbackWal(Pager *
1dc70 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1dc80 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1dc90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1dca0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
1dcb0 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20  gHdr *pList;    
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dcd0 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20  * List of dirty 
1dce0 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20  pages to revert 
1dcf0 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c  */..  /* For all
1dd00 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
1dd10 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72  che that are cur
1dd20 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20  rently dirty or 
1dd30 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
1dd40 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28  * been written (
1dd50 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  but not committe
1dd60 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  d) to the log fi
1dd70 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68  le, do one of th
1dd80 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  e .  ** followin
1dd90 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b  g:.  **.  **   +
1dda0 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63   Discard the cac
1ddb0 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66  hed page (if ref
1ddc0 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20  count==0), or.  
1ddd0 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61  **   + Reload pa
1dde0 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ge content from 
1ddf0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66  the database (if
1de00 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20   refcount>0)..  
1de10 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
1de20 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1de30 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d  OrigSize;.  rc =
1de40 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28   sqlite3WalUndo(
1de50 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61  pPager->pWal, pa
1de60 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c  gerUndoCallback,
1de70 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29   (void *)pPager)
1de80 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
1de90 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1dea0 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1deb0 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  he);.  while( pL
1dec0 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ist && rc==SQLIT
1ded0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64  E_OK ){.    PgHd
1dee0 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
1def0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63  ->pDirty;.    rc
1df00 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c   = pagerUndoCall
1df10 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61  back((void *)pPa
1df20 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
1df30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
1df40 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Next;.  }..  ret
1df50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1df60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1df70 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
1df80 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61  nd sqlite3WalFra
1df90 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61  mes(). As well a
1dfa0 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65  s logging.** the
1dfb0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1dfc0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68   list of pages h
1dfd0 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28  eaded by pList (
1dfe0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
1dff0 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  rty),.** this fu
1e000 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20  nction notifies 
1e010 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75  any active backu
1e020 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74  p processes that
1e030 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a   the pages have.
1e040 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a  ** changed. .**.
1e050 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70  ** The list of p
1e060 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f  ages passed into
1e070 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1e080 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62   always sorted b
1e090 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  y page number..*
1e0a0 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65  * Hence, if page
1e0b0 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68   1 appears anywh
1e0c0 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c  ere on the list,
1e0d0 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20   it will be the 
1e0e0 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a  first page..*/ .
1e0f0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1e100 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67  WalFrames(.  Pag
1e110 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e130 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1e140 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20    PgHdr *pList, 
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e160 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61    /* List of fra
1e170 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20  mes to log */.  
1e180 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20  Pgno nTruncate, 
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1a0 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1e1b0 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d   after this comm
1e1c0 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  it */.  int isCo
1e1d0 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1e1e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e1f0 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  if this is a com
1e200 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  mit */.){.  int 
1e210 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1e220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e230 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 23 69  eturn code */.#i
1e240 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1e250 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1e260 65 64 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ed(SQLITE_CHECK_
1e270 50 41 47 45 53 29 0a 20 20 50 67 48 64 72 20 2a  PAGES).  PgHdr *
1e280 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1e290 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1e2a0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67  looping over pag
1e2b0 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  es */.#endif..  
1e2c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e2d0 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  pWal );.  assert
1e2e0 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65  ( pList );.#ifde
1e2f0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1e300 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1e310 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73  the page list is
1e320 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
1e330 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70  der */.  for(p=p
1e340 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44  List; p && p->pD
1e350 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74  irty; p=p->pDirt
1e360 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
1e370 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69  p->pgno < p->pDi
1e380 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d  rty->pgno );.  }
1e390 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
1e3a0 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f  sCommit ){.    /
1e3b0 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73  * If a WAL trans
1e3c0 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
1e3d0 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65  committed, there
1e3e0 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1e3f0 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61  writing.    ** a
1e400 6e 79 20 70 61 67 65 73 20 77 69 74 68 20 70 61  ny pages with pa
1e410 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
1e420 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74  er than nTruncat
1e430 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66  e into the WAL f
1e440 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79  ile..    ** They
1e450 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72   will never be r
1e460 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e  ead by any clien
1e470 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65  t. So remove the
1e480 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74  m from the pDirt
1e490 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65  y.    ** list he
1e4a0 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72  re. */.    PgHdr
1e4b0 20 2a 70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a   *p;.    PgHdr *
1e4c0 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74  *ppNext = &pList
1e4d0 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  ;.    for(p=pLis
1e4e0 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29  t; (*ppNext = p)
1e4f0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1e500 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
1e510 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 20 70  o<=nTruncate ) p
1e520 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72  pNext = &p->pDir
1e530 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ty;.    }.    as
1e540 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20  sert( pList );. 
1e550 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d   }..  if( pList-
1e560 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1e570 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1e580 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1e590 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1e5a0 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1e5b0 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1e5c0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1e5d0 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1e5e0 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1e5f0 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1e600 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1e610 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1e620 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1e630 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
1e640 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1e650 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1e660 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
1e670 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
1e680 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20  ackup, p->pgno, 
1e690 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b  (u8 *)p->pData);
1e6a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
1e6b0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1e6c0 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20  PAGES.  pList = 
1e6d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1e6e0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1e6f0 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70  PCache);.  for(p
1e700 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
1e710 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67  pDirty){.    pag
1e720 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
1e730 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  p);.  }.#endif..
1e740 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e750 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65  /*.** Begin a re
1e760 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ad transaction o
1e770 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a  n the WAL..**.**
1e780 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   This routine us
1e790 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
1e7a0 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68  "pagerOpenSnapsh
1e7b0 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74  ot()" because it
1e7c0 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20   essentially.** 
1e7d0 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74  makes a snapshot
1e7e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e7f0 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
1e800 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e  point in time an
1e810 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74  d preserves.** t
1e820 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72  hat snapshot for
1e830 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64   use by the read
1e840 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63  er in spite of c
1e850 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e  oncurrently chan
1e860 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20  ges by.** other 
1e870 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b  writers or check
1e880 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  pointers..*/.sta
1e890 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67  tic int pagerBeg
1e8a0 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
1e8b0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
1e8c0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1e8f0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e  de */.  int chan
1e900 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ged = 0;        
1e910 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e920 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  if cache must be
1e930 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73   reset */..  ass
1e940 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
1e950 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
1e960 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1e970 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1e980 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1e990 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
1e9a0 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65   );..  /* sqlite
1e9b0 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
1e9c0 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74  action() was not
1e9d0 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
1e9e0 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72  previous.  ** tr
1e9f0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63  ansaction in loc
1ea00 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
1ea10 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74  IVE.  So call it
1ea20 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a   now.  If we.  *
1ea30 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67  * are in locking
1ea40 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64  _mode=NORMAL and
1ea50 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70   EndRead() was p
1ea60 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
1ea70 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69  ,.  ** the dupli
1ea80 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72  cate call is har
1ea90 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  mless..  */.  sq
1eaa0 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
1eab0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1eac0 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20  r->pWal);..  rc 
1ead0 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
1eae0 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
1eaf0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26  (pPager->pWal, &
1eb00 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20  changed);.  if( 
1eb10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1eb20 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20   changed ){.    
1eb30 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1eb40 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  er);.  }..  retu
1eb50 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1eb60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1eb70 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
1eb80 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72  s part of the tr
1eb90 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41  ansition from PA
1eba0 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50  GER_OPEN.** to P
1ebb0 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
1ebc0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
1ebd0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1ebe0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
1ebf0 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69  in pages (assumi
1ec00 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ng the page size
1ec10 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1ec20 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53  d in Pager.pageS
1ec30 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ize)..**.** If n
1ec40 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1ec50 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1ec60 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69  urned and the si
1ec70 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1ec80 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69  se.** in pages i
1ec90 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50  s stored in *pnP
1eca0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
1ecb0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70  an error code (p
1ecc0 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45  erhaps.** SQLITE
1ecd0 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73  _IOERR_FSTAT) is
1ece0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1ecf0 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e  nPage is left un
1ed00 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61  modified..*/.sta
1ed10 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67  tic int pagerPag
1ed20 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
1ed30 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61  ager, Pgno *pnPa
1ed40 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ge){.  Pgno nPag
1ed50 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1ed60 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1ed70 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
1ed80 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51  nPage */..  /* Q
1ed90 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62  uery the WAL sub
1eda0 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
1edb0 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54  database size. T
1edc0 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20  he WalDbsize(). 
1edd0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74   ** function ret
1ede0 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65  urns zero if the
1edf0 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e   WAL is not open
1ee00 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61   (i.e. Pager.pWa
1ee10 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69  l==0), or.  ** i
1ee20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1ee30 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ize is not avail
1ee40 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61  able. The databa
1ee50 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20  se size is not. 
1ee60 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72   ** available fr
1ee70 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1ee80 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67  ystem if the log
1ee90 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f   file is empty o
1eea0 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  r.  ** contains 
1eeb0 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74  no valid committ
1eec0 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ed transactions.
1eed0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1eee0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1eef0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
1ef00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ef10 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
1ef20 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f  CK || pPager->no
1ef30 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20 20 6e 50  Readlock );.  nP
1ef40 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  age = sqlite3Wal
1ef50 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  Dbsize(pPager->p
1ef60 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Wal);..  /* If t
1ef70 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1ef80 20 77 61 73 20 6e 6f 74 20 61 76 61 69 6c 61 62   was not availab
1ef90 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20  le from the WAL 
1efa0 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a  sub-system,.  **
1efb0 20 64 65 74 65 72 6d 69 6e 65 20 69 74 20 62 61   determine it ba
1efc0 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20  sed on the size 
1efd0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1efe0 66 69 6c 65 2e 20 49 66 20 74 68 65 20 73 69 7a  file. If the siz
1eff0 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61  e.  ** of the da
1f000 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
1f010 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
1f020 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
1f030 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f  ge-size,.  ** ro
1f040 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  und down to the 
1f050 6e 65 61 72 65 73 74 20 70 61 67 65 2e 20 45 78  nearest page. Ex
1f060 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c  cept, any file l
1f070 61 72 67 65 72 20 74 68 61 6e 20 30 0a 20 20 2a  arger than 0.  *
1f080 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20  * bytes in size 
1f090 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  is considered to
1f0a0 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73   contain at leas
1f0b0 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f  t one page..  */
1f0c0 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
1f0d0 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  ){.    i64 n = 0
1f0e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f0f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1f100 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  db file in bytes
1f110 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1f120 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1f130 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1f140 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
1f150 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1f160 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  >fd) ){.      in
1f170 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
1f180 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1f190 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  >fd, &n);.      
1f1a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f1b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1f1c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1f1d0 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20      }.    nPage 
1f1e0 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61  = (Pgno)(n / pPa
1f1f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1f200 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
1f210 20 26 26 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20   && n>0 ){.     
1f220 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20   nPage = 1;.    
1f230 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1f240 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
1f250 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1f260 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65  e file is greate
1f270 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20  r than the.  ** 
1f280 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d  configured maxim
1f290 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c  um pager number,
1f2a0 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   increase the al
1f2b0 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20  lowed limit so. 
1f2c0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c   ** that the fil
1f2d0 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20  e can be read.. 
1f2e0 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e   */.  if( nPage>
1f2f0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
1f300 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
1f310 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61  Pgno = (Pgno)nPa
1f320 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61  ge;.  }..  *pnPa
1f330 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
1f340 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f350 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1f360 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
1f370 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d   Check if the *-
1f380 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f  wal file that co
1f390 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1f3a0 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
1f3b0 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78   by pPager.** ex
1f3c0 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74 61  ists if the data
1f3d0 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79  base is not empy
1f3e0 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61 74  , or verify that
1f3f0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1f400 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73  does.** not exis
1f410 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69  t (by deleting i
1f420 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  t) if the databa
1f430 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  se file is empty
1f440 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
1f450 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
1f460 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77  mpty and the *-w
1f470 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
1f480 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  open the pager.*
1f490 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20  * in WAL mode.  
1f4a0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1f4b0 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e  is empty or if n
1f4c0 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69  o *-wal file exi
1f4d0 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f  sts and.** if no
1f4e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d   error occurs, m
1f4f0 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a  ake sure Pager.j
1f500 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f  ournalMode is no
1f510 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45  t set to.** PAGE
1f520 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
1f530 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  L..**.** Return 
1f540 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20  SQLITE_OK or an 
1f550 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
1f560 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
1f570 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20  t hold a SHARED 
1f580 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1f590 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c  base file to cal
1f5a0 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  l this.** functi
1f5b0 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45  on. Because an E
1f5c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1f5d0 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20   the db file is 
1f5e0 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65  required to dele
1f5f0 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20  te .** a WAL on 
1f600 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74  a none-empty dat
1f610 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75  abase, this ensu
1f620 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  res there is no 
1f630 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  race condition .
1f640 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78  ** between the x
1f650 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61  Access() below a
1f660 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20  nd an xDelete() 
1f670 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62  being executed b
1f680 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72  y some .** other
1f690 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
1f6a0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1f6b0 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
1f6c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1f6d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1f6e0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
1f6f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1f700 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
1f710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f720 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
1f730 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  OCK || pPager->n
1f740 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 0a 20 20  oReadlock );..  
1f750 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
1f760 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
1f770 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20   isWal;         
1f780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1f790 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65  ue if WAL file e
1f7a0 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e  xists */.    Pgn
1f7b0 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
1f7c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1f7d0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1f7e0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
1f7f0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
1f800 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
1f810 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1f820 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f830 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
1f840 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1f850 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
1f860 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
1f870 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ->zWal, 0);.    
1f880 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20    isWal = 0;.   
1f890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1f8a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
1f8b0 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  ss(.          pP
1f8c0 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
1f8d0 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45  er->zWal, SQLITE
1f8e0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
1f8f0 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a  &isWal.      );.
1f900 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1f910 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f920 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29       if( isWal )
1f930 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
1f940 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  se( sqlite3Pcach
1f950 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
1f960 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
1f970 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1f980 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
1f990 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  al(pPager, 0);. 
1f9a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1f9b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1f9c0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
1f9d0 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20  LMODE_WAL ){.   
1f9e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1f9f0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
1fa00 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
1fa10 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ETE;.      }.   
1fa20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1fa30 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
1fa40 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76  .** Playback sav
1fa50 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e  epoint pSavepoin
1fa60 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70  t. Or, if pSavep
1fa70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  oint==NULL, then
1fa80 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65   playback.** the
1fa90 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
1faa0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
1fab0 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74   case pSavepoint
1fac0 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68  ==NULL occurs wh
1fad0 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43  en .** a ROLLBAC
1fae0 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20  K TO command is 
1faf0 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56  invoked on a SAV
1fb00 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61  EPOINT that is a
1fb10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
1fb20 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
1fb30 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e  * When pSavepoin
1fb40 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d  t is not NULL (m
1fb50 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61  eaning a non-tra
1fb60 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
1fb70 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20  nt is .** being 
1fb80 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68  rolled back), th
1fb90 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
1fba0 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74  consists of up t
1fbb0 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a  o three stages,.
1fbc0 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20  ** performed in 
1fbd0 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66  the order specif
1fbe0 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ied:.**.**   * P
1fbf0 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20  ages are played 
1fc00 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
1fc10 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
1fc20 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20  ing at byte.**  
1fc30 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53     offset PagerS
1fc40 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
1fc50 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
1fc60 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  to .**     Pager
1fc70 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1fc80 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20  fset, or to the 
1fc90 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
1fca0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
1fcb0 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65  ile if PagerSave
1fcc0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
1fcd0 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   is zero..**.** 
1fce0 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65    * If PagerSave
1fcf0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
1fd00 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
1fd10 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61  en pages are pla
1fd20 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20  yed.**     back 
1fd30 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68  starting from th
1fd40 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1fd50 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1fd60 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50  lowing .**     P
1fd70 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1fd80 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  drOffset to the 
1fd90 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
1fda0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
1fdb0 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
1fdc0 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61  e then played ba
1fdd0 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ck from the sub-
1fde0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74  journal file, st
1fdf0 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69  arting.**     wi
1fe00 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65  th the PagerSave
1fe10 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e  point.iSubRec an
1fe20 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
1fe30 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20  the end of.**   
1fe40 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
1fe50 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67  le..**.** Throug
1fe60 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63  hout the rollbac
1fe70 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20  k process, each 
1fe80 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72  time a page is r
1fe90 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a  olled back, the.
1fea0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
1feb0 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61   bit is set in a
1fec0 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
1fed0 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e  e (variable pDon
1fee0 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c  e in the.** impl
1fef0 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77  ementation below
1ff00 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ). This is used 
1ff10 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  to ensure that a
1ff20 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a   page is only.**
1ff30 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
1ff40 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69   first time it i
1ff50 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e  s encountered in
1ff60 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e   either journal.
1ff70 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70  .**.** If pSavep
1ff80 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  oint is NULL, th
1ff90 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c  en pages are onl
1ffa0 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  y played back fr
1ffb0 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  om the main.** j
1ffc0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
1ffd0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
1ffe0 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68  r a bitvec in th
1fff0 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
20000 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62  n either case, b
20010 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63  efore playback c
20020 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67  ommences the Pag
20030 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62  er.dbSize variab
20040 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74  le.** is reset t
20050 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  o the value that
20060 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20   it held at the 
20070 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76  start of the sav
20080 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74  epoint .** (or t
20090 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20  ransaction). No 
200a0 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65  page with a page
200b0 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20  -number greater 
200c0 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a  than this value.
200d0 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ** is played bac
200e0 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63  k. If one is enc
200f0 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73  ountered it is s
20100 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a  imply skipped..*
20110 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
20120 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
20130 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
20140 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  r, PagerSavepoin
20150 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a  t *pSavepoint){.
20160 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
20170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66             /* Ef
20180 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
20190 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
201a0 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
201b0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
201c0 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73  * End of first s
201d0 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a  egment of main-j
201e0 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a  ournal records *
201f0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
20200 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
20210 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
20220 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d   Bitvec *pDone =
20230 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74   0;       /* Bit
20240 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61  vec to ensure pa
20250 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ges played back 
20260 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20  only once */..  
20270 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20280 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
20290 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
202a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
202b0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
202c0 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  CKED );..  /* Al
202d0 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20  locate a bitvec 
202e0 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20  to use to store 
202f0 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73  the set of pages
20300 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a   rolled back */.
20310 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
20320 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20   ){.    pDone = 
20330 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
20340 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e  ate(pSavepoint->
20350 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20  nOrig);.    if( 
20360 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  !pDone ){.      
20370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
20380 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  MEM;.    }.  }..
20390 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74    /* Set the dat
203a0 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20  abase size back 
203b0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
203c0 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73  was before the s
203d0 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62  avepoint .  ** b
203e0 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
203f0 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
20400 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
20410 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
20420 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
20430 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
20440 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  gSize;.  pPager-
20450 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
20460 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
20470 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61  ile;..  if( !pSa
20480 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72  vepoint && pager
20490 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
204a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
204b0 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50  erRollbackWal(pP
204c0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
204d0 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
204e0 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
204f0 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
20500 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
20510 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
20520 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
20530 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
20540 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
20550 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
20560 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
20570 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
20580 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
20590 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
205a0 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
205b0 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
205c0 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
205d0 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
205e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
205f0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
20600 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
20610 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f  | szJ==0 );..  /
20620 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
20630 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
20640 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
20650 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
20660 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
20670 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
20680 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
20690 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
206a0 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
206b0 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
206c0 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
206d0 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
206e0 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
206f0 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
20700 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
20710 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
20720 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
20730 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
20740 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
20750 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
20760 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
20770 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
20780 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
20790 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
207a0 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61  Savepoint && !pa
207b0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
207c0 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  ) ){.    iHdrOff
207d0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
207e0 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
207f0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
20800 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
20810 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20820 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
20830 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
20840 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
20850 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
20860 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
20870 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
20880 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
20890 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
208a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
208b0 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
208c0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
208d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
208e0 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
208f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20900 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
20910 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
20920 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
20930 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
20940 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
20950 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
20960 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
20970 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
20980 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
20990 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
209a0 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
209b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
209c0 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
209d0 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
209e0 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
209f0 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
20a00 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
20a10 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
20a20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
20a30 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
20a40 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
20a50 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
20a60 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
20a70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
20a80 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
20a90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20aa0 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
20ab0 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
20ac0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
20ad0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
20ae0 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
20af0 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
20b00 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
20b10 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
20b20 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
20b30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
20b40 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
20b50 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
20b60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
20b70 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
20b80 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
20b90 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
20ba0 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
20bb0 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
20bc0 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
20bd0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
20be0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
20bf0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   */.    if( nJRe
20c00 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
20c10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
20c20 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
20c30 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
20c40 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
20c50 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
20c60 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50   (u32)((szJ - pP
20c70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20c80 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
20c90 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
20ca0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
20cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
20cc0 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
20cd0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
20ce0 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
20cf0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
20d00 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
20d10 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
20d20 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
20d30 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
20d40 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20d50 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
20d60 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
20d70 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
20d80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d  er->journalOff>=
20d90 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
20da0 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
20db0 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
20dc0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
20dd0 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
20de0 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
20df0 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
20e00 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20e10 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
20e20 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
20e30 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
20e40 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
20e50 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
20e60 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
20e70 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
20e80 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
20e90 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
20ea0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
20eb0 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53  offset = (i64)pS
20ec0 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
20ed0 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
20ee0 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
20ef0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
20f00 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
20f10 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
20f20 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
20f30 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
20f40 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
20f50 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
20f60 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
20f70 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
20f80 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
20f90 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
20fa0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20fb0 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a  offset==(i64)ii*
20fc0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
20fd0 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
20fe0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
20ff0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
21000 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e  r, &offset, pDon
21010 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 0, 1);.    }.
21020 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21030 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21040 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
21050 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
21060 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
21070 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
21080 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21090 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72   = szJ;.  }..  r
210a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
210b0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
210c0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
210d0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
210e0 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
210f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21100 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
21110 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
21120 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
21130 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
21140 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
21150 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
21160 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ge);.}../*.** Fr
21170 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
21180 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
21190 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  om the pager..*/
211a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
211b0 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a  erShrink(Pager *
211c0 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
211d0 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70  e3PcacheShrink(p
211e0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
211f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
21200 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
21210 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21220 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
21230 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
21240 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
21250 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
21260 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
21270 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
21280 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
21290 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
212a0 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
212b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
212c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
212d0 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
212e0 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
212f0 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
21300 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
21310 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
21320 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
21330 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
21340 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
21350 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
21360 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
21370 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
21380 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
21390 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
213a0 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
213b0 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
213d0 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
213e0 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
213f0 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
21400 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21410 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
21420 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
21430 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
21440 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
21450 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
21460 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
21470 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
21480 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
21490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
214a0 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
214b0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
214c0 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
214d0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
214e0 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
214f0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
21500 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21510 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
21520 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
21530 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
21540 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
21550 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
21560 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
21570 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
21580 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
21590 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
215a0 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
215b0 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
215c0 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
215d0 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
215e0 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
215f0 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
21600 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
21610 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21620 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
21630 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
21640 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
21650 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
21660 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
21670 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
21680 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
21690 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
216a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
216b0 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
216c0 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
216d0 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
216e0 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
216f0 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
21700 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
21710 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
21720 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
21730 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
21740 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
21750 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
21760 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
21770 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
21780 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
21790 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
217a0 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
217b0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
217c0 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
217d0 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
217e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
217f0 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
21800 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
21810 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
21820 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
21830 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
21840 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
21850 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
21860 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
21870 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
21880 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
21890 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
218a0 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
218b0 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
218c0 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
218d0 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
218e0 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
218f0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
21900 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
21910 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
21920 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
21930 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
21940 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
21950 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
21960 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
21970 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
21980 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
21990 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
219a0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
219b0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
219c0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
219d0 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
219e0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
219f0 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
21a00 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
21a10 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
21a20 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
21a30 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
21a40 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
21a50 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
21a60 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
21a70 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
21a80 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
21a90 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
21aa0 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
21ab0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
21ac0 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
21ad0 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
21ae0 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
21af0 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
21b00 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
21b10 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
21b20 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
21b30 65 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67 65  etyLevel(.  Page
21b40 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
21b50 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
21b60 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76  o set safety lev
21b70 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  el for */.  int 
21b80 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  level,          
21b90 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63    /* PRAGMA sync
21ba0 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c  hronous.  1=OFF,
21bb0 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c   2=NORMAL, 3=FUL
21bc0 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46 75  L */  .  int bFu
21bd0 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20 2f  llFsync,       /
21be0 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79  * PRAGMA fullfsy
21bf0 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70  nc */.  int bCkp
21c00 74 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a  tFullFsync    /*
21c10 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
21c20 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a  nt_fullfsync */.
21c30 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  ){.  assert( lev
21c40 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
21c50 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  3 );.  pPager->n
21c60 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
21c70 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
21c80 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
21c90 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
21ca0 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
21cb0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
21cc0 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70  e) ?1:0;.  if( p
21cd0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
21ce0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
21cf0 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  cFlags = 0;.    
21d00 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
21d10 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c  Flags = 0;.  }el
21d20 73 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79 6e  se if( bFullFsyn
21d30 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
21d40 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
21d50 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
21d60 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
21d70 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
21d80 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
21d90 65 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46 75  else if( bCkptFu
21da0 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70  llFsync ){.    p
21db0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
21dc0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
21dd0 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
21de0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
21df0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
21e00 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
21e10 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
21e20 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
21e30 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
21e40 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
21e50 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
21e60 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  C_NORMAL;.  }.  
21e70 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
21e80 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73  lags = pPager->s
21e90 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  yncFlags;.  if( 
21ea0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
21eb0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
21ec0 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20  walSyncFlags |= 
21ed0 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43  WAL_SYNC_TRANSAC
21ee0 54 49 4f 4e 53 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  TIONS;.  }.}.#en
21ef0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
21f00 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
21f10 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
21f20 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
21f30 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
21f40 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
21f50 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
21f60 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
21f70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
21f80 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
21f90 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
21fa0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
21fb0 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
21fc0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
21fd0 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
21fe0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
21ff0 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
22000 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
22010 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
22020 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
22030 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
22040 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
22050 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
22060 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
22070 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
22080 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
22090 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
220a0 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
220b0 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
220c0 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
220d0 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
220e0 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
220f0 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
22100 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
22110 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
22120 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
22130 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
22140 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
22150 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
22160 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
22170 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22180 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
22190 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
221a0 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
221b0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
221c0 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
221d0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
221e0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
221f0 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
22200 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
22210 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
22220 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
22230 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
22240 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
22250 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
22260 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
22270 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22290 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
222a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
222b0 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
222c0 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
222d0 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
222e0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
222f0 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
22300 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
22310 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
22320 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
22330 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
22340 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
22350 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
22360 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
22370 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
22380 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
22390 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
223a0 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
223b0 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
223c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
223d0 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
223e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
223f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
22400 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
22410 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
22420 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
22430 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
22440 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
22450 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
22460 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
22470 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
22480 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
22490 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
224a0 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
224b0 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
224c0 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
224d0 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
224e0 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
224f0 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
22500 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
22510 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
22520 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
22530 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
22540 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
22550 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
22560 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
22570 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
22580 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
22590 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
225a0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
225b0 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
225c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
225d0 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
225e0 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
225f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22620 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
22630 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
22640 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
22650 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
22660 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
22670 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
22680 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
22690 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
226a0 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
226b0 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
226c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
226d0 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
226e0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
226f0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
22700 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
22710 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
22720 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
22730 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
22740 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
22750 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
22760 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
22770 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
22780 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
22790 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
227a0 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
227b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227d0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
227e0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
227f0 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
22800 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
22810 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
22820 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
22830 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
22840 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
22850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22860 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
22870 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
22880 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72  */.){  .  pPager
22890 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
228a0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
228b0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
228c0 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
228d0 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f  HandlerArg;.}../
228e0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
228f0 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
22900 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
22910 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
22920 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
22930 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
22940 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
22950 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
22960 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
22970 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
22980 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
22990 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
229a0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
229b0 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
229c0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
229d0 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
229e0 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53  LITE_IOERR, an S
229f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20  QLITE_IOERR_xxx 
22a00 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49  sub-code or SQLI
22a10 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20  TE_FULL)..**.** 
22a20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c  Otherwise, if al
22a30 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
22a40 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
22a50 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70  **   * the new p
22a60 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20  age size (value 
22a70 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69  of *pPageSize) i
22a80 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72  s valid (a power
22a90 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20   .**     of two 
22aa0 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
22ab0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
22ac0 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29  SIZE, inclusive)
22ad0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
22ae0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
22af0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
22b00 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a  ferences, and.**
22b10 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
22b20 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e  base is either n
22b30 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ot an in-memory 
22b40 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69  database or it i
22b50 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d  s.**     an in-m
22b60 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74  emory database t
22b70 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  hat currently co
22b80 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70  nsists of zero p
22b90 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ages..**.** then
22ba0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
22bb0 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  t page size is s
22bc0 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65  et to *pPageSize
22bd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
22be0 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e  age size is chan
22bf0 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ged, then this f
22c00 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c  unction uses sql
22c10 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28  ite3PagerMalloc(
22c20 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  ) .** to obtain 
22c30 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70  a new Pager.pTmp
22c40 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66  Space buffer. If
22c50 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e   this allocation
22c60 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69   attempt .** fai
22c70 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
22c80 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
22c90 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72   the page size r
22ca0 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
22cb0 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68  . .** In all oth
22cc0 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45  er cases, SQLITE
22cd0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
22ce0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
22cf0 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63  ge size is not c
22d00 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62  hanged, either b
22d10 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68  ecause one of th
22d20 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20  e enumerated.** 
22d30 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
22d40 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68   is not true, th
22d50 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
22d60 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
22d70 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
22d80 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20   was called, or 
22d90 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f  because the memo
22da0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  ry allocation at
22db0 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a  tempt failed, .*
22dc0 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a  * then *pPageSiz
22dd0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
22de0 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61  old, retained pa
22df0 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72  ge size before r
22e00 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
22e10 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22e20 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  Pagesize(Pager *
22e30 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61  pPager, u32 *pPa
22e40 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
22e50 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  erve){.  int rc 
22e60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
22e70 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
22e80 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75  sible to do a fu
22e90 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ll assert_pager_
22ea0 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73  state() here, as
22eb0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
22ec0 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
22ed0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61  d from within Pa
22ee0 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72  gerOpen(), befor
22ef0 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a  e the state.  **
22f00 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
22f10 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c  ject is internal
22f20 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20  ly consistent.. 
22f30 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20   **.  ** At one 
22f40 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74  point this funct
22f50 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20  ion returned an 
22f60 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67  error if the pag
22f70 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  er was in .  ** 
22f80 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
22f90 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47  e. But since PAG
22fa0 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67  ER_ERROR state g
22fb0 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20  uarantees that. 
22fc0 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20   ** there is at 
22fd0 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
22fe0 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
22ff0 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74  ence, this funct
23000 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f  ion.  ** is a no
23010 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73  -op for that cas
23020 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a  e anyhow..  */..
23030 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d    u32 pageSize =
23040 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61   *pPageSize;.  a
23050 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
23060 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
23070 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
23080 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
23090 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28  E_SIZE) );.  if(
230a0 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d   (pPager->memDb=
230b0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  =0 || pPager->db
230c0 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73  Size==0).   && s
230d0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
230e0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
230f0 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20  ache)==0 .   && 
23100 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
23110 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65  Size!=(u32)pPage
23120 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29  r->pageSize .  )
23130 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77  {.    char *pNew
23140 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20   = NULL;        
23150 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70       /* New temp
23160 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36   space */.    i6
23170 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20  4 nByte = 0;..  
23180 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
23190 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20  tate>PAGER_OPEN 
231a0 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
231b0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72  ->fd) ){.      r
231c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
231d0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
231e0 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  , &nByte);.    }
231f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23200 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23210 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
23220 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
23230 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
23240 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 63    if( !pNew ) rc
23250 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
23260 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
23270 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23280 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
23290 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
232a0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
232b0 20 3d 20 28 50 67 6e 6f 29 28 6e 42 79 74 65 2f   = (Pgno)(nByte/
232c0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
232d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
232e0 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
232f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
23300 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
23310 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
23320 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
23330 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 73 71  = pNew;.      sq
23340 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61  lite3PcacheSetPa
23350 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  geSize(pPager->p
23360 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65  PCache, pageSize
23370 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
23380 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61  *pPageSize = pPa
23390 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
233a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
233b0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52  OK ){.    if( nR
233c0 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65  eserve<0 ) nRese
233d0 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  rve = pPager->nR
233e0 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
233f0 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
23400 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30  && nReserve<1000
23410 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
23420 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29  nReserve = (i16)
23430 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
23440 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
23450 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
23460 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23470 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
23480 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
23490 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
234a0 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
234b0 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
234c0 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
234d0 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
234e0 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
234f0 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
23500 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
23510 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
23520 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
23530 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
23540 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
23550 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
23560 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
23570 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
23580 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
23590 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
235a0 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
235b0 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
235c0 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
235d0 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
235e0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
235f0 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
23600 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
23610 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
23620 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
23630 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
23640 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
23650 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
23660 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
23670 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
23680 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
23690 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
236a0 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
236b0 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
236c0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
236d0 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
236e0 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
236f0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
23700 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
23710 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
23720 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
23730 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
23740 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
23750 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
23760 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
23770 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
23780 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
23790 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
237a0 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73  xPage;.  }.  ass
237b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
237c0 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
237d0 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65  );      /* Calle
237e0 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78  d only by OP_Max
237f0 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72  Pgcnt */.  asser
23800 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  t( pPager->mxPgn
23810 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o>=pPager->dbSiz
23820 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50  e );  /* OP_MaxP
23830 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68  gcnt enforces th
23840 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  is */.  return p
23850 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
23860 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
23870 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
23880 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
23890 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
238a0 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
238b0 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
238c0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
238d0 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
238e0 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
238f0 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
23900 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
23910 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
23920 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
23930 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
23940 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
23950 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
23960 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
23970 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
23980 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
23990 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
239a0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
239b0 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
239c0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
239d0 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
239e0 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
239f0 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
23a00 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
23a10 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
23a20 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
23a30 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
23a40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
23a50 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
23a60 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
23a70 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
23a80 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
23a90 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
23aa0 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
23ab0 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
23ac0 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
23ad0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
23ae0 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
23af0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
23b00 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
23b10 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
23b20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
23b30 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
23b40 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
23b50 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
23b60 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
23b70 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
23b80 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
23b90 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
23ba0 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
23bb0 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
23bc0 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
23bd0 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
23be0 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
23bf0 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
23c00 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
23c10 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
23c20 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
23c30 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
23c40 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
23c50 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
23c60 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
23c70 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
23c80 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
23c90 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
23ca0 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
23cb0 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
23cc0 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
23cd0 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
23ce0 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
23cf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
23d00 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
23d10 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
23d20 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
23d30 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
23d40 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
23d50 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
23d60 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
23d70 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
23d80 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
23d90 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
23da0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
23db0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
23dc0 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
23dd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
23de0 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
23df0 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
23e00 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
23e10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
23e20 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  File );..  /* Th
23e30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
23e40 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72  ly called by btr
23e50 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ee immediately a
23e60 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20  fter creating.  
23e70 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  ** the Pager obj
23e80 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20  ect.  There has 
23e90 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f  not been an oppo
23ea0 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73  rtunity to trans
23eb0 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41  ition.  ** to WA
23ec0 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f  L mode yet..  */
23ed0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
23ee0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
23ef0 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  );..  if( isOpen
23f00 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
23f10 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
23f20 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
23f30 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
23f40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
23f50 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
23f60 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
23f70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23f80 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
23f90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
23fa0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
23fb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23fc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
23fd0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
23fe0 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
23ff0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
24000 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  on is open on.**
24010 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72   the pager. It r
24020 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c  eturns the total
24030 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
24040 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
24050 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ..**.** However,
24060 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
24070 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
24080 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
24090 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
240a0 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
240b0 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
240c0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
240d0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
240e0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
240f0 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
24100 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24110 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
24120 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
24130 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
24140 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e!=PAGER_WRITER_
24150 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70  FINISHED );.  *p
24160 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61  nPage = (int)pPa
24170 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a  ger->dbSize;.}..
24180 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
24190 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74  tain a lock of t
241a0 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20  ype locktype on 
241b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
241c0 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c  e. If.** a simil
241d0 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ar or greater lo
241e0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
241f0 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
24200 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20  n is a no-op.** 
24210 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54  (returning SQLIT
24220 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79  E_OK immediately
24230 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
24240 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  se, attempt to o
24250 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75  btain the lock u
24260 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f  sing sqlite3OsLo
24270 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a  ck(). Invoke .**
24280 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
24290 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ck if the lock i
242a0 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
242b0 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61  available. Repea
242c0 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20  t .** until the 
242d0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
242e0 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75  turns false or u
242f0 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74  ntil the attempt
24300 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74   to .** obtain t
24310 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
24320 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
24330 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
24340 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
24350 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
24360 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
24370 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
24380 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73  ck is obtained s
24390 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74  uccessfully, set
243a0 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65   the Pager.state
243b0 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f   .** variable to
243c0 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65   locktype before
243d0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
243e0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
243f0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
24400 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
24410 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
24420 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24440 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
24450 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
24460 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74  that this is eit
24470 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63  her a no-op (bec
24480 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74  ause the request
24490 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a  ed lock is .  **
244a0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
244b0 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61  r one of the tra
244c0 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74 20 74  nsistions that t
244d0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a  he busy-handler.
244e0 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f    ** may be invo
244f0 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f  ked during, acco
24500 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
24510 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20  ment above.  ** 
24520 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
24530 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20  usyhandler()..  
24540 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  */.  assert( (pP
24550 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63  ager->eLock>=loc
24560 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c  ktype).       ||
24570 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
24580 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  =NO_LOCK && lock
24590 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
245a0 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  K).       || (pP
245b0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53  ager->eLock==RES
245c0 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f  ERVED_LOCK && lo
245d0 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
245e0 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20  E_LOCK).  );..  
245f0 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  do {.    rc = pa
24600 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
24610 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d  , locktype);.  }
24620 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
24630 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72  E_BUSY && pPager
24640 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70  ->xBusyHandler(p
24650 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
24660 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74  lerArg) );.  ret
24670 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24680 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74   Function assert
24690 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
246a0 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b  nt(pPager) check
246b0 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
246c0 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
246d0 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20  is true for all 
246e0 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72  dirty pages curr
246f0 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
24700 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20  e-cache:.**.**  
24710 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d   a) The page num
24720 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
24730 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
24740 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
24750 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61        current da
24760 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e  tabase image, in
24770 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a   pages, OR.**.**
24780 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67     b) if the pag
24790 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77  e content were w
247a0 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74  ritten at this t
247b0 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ime, it would no
247c0 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63  t.**      be nec
247d0 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
247e0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
247f0 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73  ent out to the s
24800 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ub-journal.**   
24810 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65     (as determine
24820 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75  d by function su
24830 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
24840 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
24850 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74  condition assert
24860 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
24870 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
24880 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69  e, and the.** di
24890 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f  rty page were to
248a0 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72   be discarded fr
248b0 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61  om the cache via
248c0 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73   the pagerStress
248d0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70  ().** routine, p
248e0 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75  agerStress() wou
248f0 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  ld not write the
24900 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
24910 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ntent to.** the 
24920 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
24930 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  f a savepoint tr
24940 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72  ansaction were r
24950 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72  olled back after
24960 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65  .** this happene
24970 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  d, the correct b
24980 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62  ehaviour would b
24990 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  e to restore the
249a0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74   current.** cont
249b0 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
249c0 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   However, since 
249d0 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20  this content is 
249e0 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65  not present in e
249f0 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74  ither.** the dat
24a00 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68  abase file or th
24a10 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  e portion of the
24a20 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
24a30 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f  l and .** sub-jo
24a40 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63  urnal rolled bac
24a50 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f  k the content co
24a60 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f  uld not be resto
24a70 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  red and the.** d
24a80 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f  atabase image wo
24a90 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
24aa0 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66  pt. It is theref
24ab0 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68  ore fortunate th
24ac0 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63  at .** this circ
24ad0 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20  umstance cannot 
24ae0 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65  arise..*/.#if de
24af0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
24b00 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UG).static void 
24b10 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
24b20 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72  nstraintCb(PgHdr
24b30 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
24b40 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
24b50 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73  DR_DIRTY );.  as
24b60 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69  sert( !subjRequi
24b70 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20  resPage(pPg) || 
24b80 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e  pPg->pgno<=pPg->
24b90 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
24ba0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
24bb0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
24bc0 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a  nstraint(Pager *
24bd0 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
24be0 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
24bf0 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
24c00 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e  ache, assertTrun
24c10 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
24c20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
24c30 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  ine assertTrunca
24c40 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
24c50 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ger).#endif../*.
24c60 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
24c70 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
24c80 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f  se file image to
24c90 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68   nPage pages. Th
24ca0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
24cb0 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  does not actuall
24cc0 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74  y modify the dat
24cd0 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
24ce0 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20  sk. It .** just 
24cf0 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61  sets the interna
24d00 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  l state of the p
24d10 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74  ager object so t
24d20 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e  hat the .** trun
24d30 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64  cation will be d
24d40 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  one when the cur
24d50 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
24d60 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
24d70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
24d80 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
24d90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24da0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61  Pgno nPage){.  a
24db0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
24dc0 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
24dd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24de0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
24df0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
24e00 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
24e10 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61  ize = nPage;.  a
24e20 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
24e30 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b  straint(pPager);
24e40 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
24e50 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
24e60 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
24e70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
24e80 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
24e90 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
24ea0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
24eb0 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
24ec0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
24ed0 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
24ee0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
24ef0 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
24f00 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
24f10 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
24f20 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
24f30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
24f40 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
24f50 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
24f60 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
24f70 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
24f80 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
24f90 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
24fa0 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
24fb0 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
24fc0 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
24fd0 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
24fe0 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
24ff0 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
25000 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
25010 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
25020 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
25030 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
25040 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
25050 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
25060 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
25070 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
25080 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
25090 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
250a0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
250b0 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
250c0 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
250d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
250e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
250f0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
25100 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
25110 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
25120 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
25130 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
25140 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
25150 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25160 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
25170 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
25180 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
25190 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
251a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
251b0 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
251c0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
251d0 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
251e0 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
251f0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
25200 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
25210 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
25220 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
25230 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
25240 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
25250 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
25260 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
25270 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
25280 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
25290 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
252a0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
252b0 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
252c0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
252d0 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
252e0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
252f0 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
25300 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
25310 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
25320 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
25330 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
25340 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
25350 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
25360 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
25370 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
25380 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
25390 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
253a0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
253b0 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
253c0 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
253d0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
253e0 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
253f0 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
25400 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
25410 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
25420 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
25430 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
25440 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
25450 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72  pSpace;..  asser
25460 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
25470 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
25480 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
25490 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
254a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
254b0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
254c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
254d0 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Code = 0; */.  p
254e0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
254f0 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Mode = 0;.#ifnde
25500 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
25510 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c  L.  sqlite3WalCl
25520 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ose(pPager->pWal
25530 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79  , pPager->ckptSy
25540 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d  ncFlags, pPager-
25550 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 29  >pageSize, pTmp)
25560 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  ;.  pPager->pWal
25570 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
25580 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
25590 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  r);.  if( MEMDB 
255a0 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  ){.    pager_unl
255b0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
255c0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
255d0 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63  it is open, sync
255e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
255f0 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
25600 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61   UnlockAndRollba
25610 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  ck..    ** If th
25620 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20  is is not done, 
25630 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64  then an unsynced
25640 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
25650 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  open journal .  
25660 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65    ** file may be
25670 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
25680 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
25690 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
256a0 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a  re occurs .    *
256b0 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20  * while this is 
256c0 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64  happening, the d
256d0 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
256e0 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20  come corrupt..  
256f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61    **.    ** If a
25700 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
25710 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
25720 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  ync the journal,
25730 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65 72   shift the pager
25740 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
25750 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68   ERROR state. Th
25760 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b  is causes Unlock
25770 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75  AndRollback to u
25780 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a  nlock the.    **
25790 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
257a0 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
257b0 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74  file without att
257c0 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
257d0 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f  it.    ** back o
257e0 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54  r finalize it. T
257f0 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73 65  he next database
25800 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20   user will have 
25810 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  to do hot-journa
25820 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  l.    ** rollbac
25830 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73 69  k before accessi
25840 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
25850 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
25860 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
25870 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
25880 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
25890 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48  ager, pagerSyncH
258a0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
258b0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
258c0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
258d0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
258e0 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  }.  sqlite3EndBe
258f0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
25900 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
25910 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
25920 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f  PAGERTRACE(("CLO
25930 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
25940 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49  D(pPager)));.  I
25950 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
25960 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
25970 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
25980 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
25990 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
259a0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71  Pager->fd);.  sq
259b0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54  lite3PageFree(pT
259c0 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  mp);.  sqlite3Pc
259d0 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
259e0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66  ->pPCache);..#if
259f0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
25a00 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65  ODEC.  if( pPage
25a10 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20  r->xCodecFree ) 
25a20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
25a30 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ee(pPager->pCode
25a40 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  c);.#endif..  as
25a50 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61  sert( !pPager->a
25a60 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50  Savepoint && !pP
25a70 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
25a80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69   );.  assert( !i
25a90 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
25aa0 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
25ab0 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a  ager->sjfd) );..
25ac0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
25ad0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
25ae0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
25af0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
25b00 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
25b10 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
25b20 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
25b30 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67  e number for pag
25b40 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73  e pPg..*/.Pgno s
25b50 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
25b60 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50  umber(DbPage *pP
25b70 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
25b80 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
25b90 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
25ba0 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
25bb0 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70  count for page p
25bc0 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Pg..*/.void sqli
25bd0 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
25be0 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69  ge *pPg){.  sqli
25bf0 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67  te3PcacheRef(pPg
25c00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  );.}../*.** Sync
25c10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e   the journal. In
25c20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
25c30 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
25c40 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
25c50 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
25c60 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
25c70 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
25c80 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
25c90 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   of the.** disk 
25ca0 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f  and can be resto
25cb0 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
25cc0 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
25cd0 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  l rollback..**.*
25ce0 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
25cf0 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  oSync flag is se
25d00 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
25d10 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
25d20 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
25d30 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75  the actions requ
25d40 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74  ired depend on t
25d50 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
25d60 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69  and the .** devi
25d70 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
25d80 63 73 20 6f 66 20 74 68 65 20 74 68 65 20 66 69  cs of the the fi
25d90 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f  le-system, as fo
25da0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  llows:.**.**   *
25db0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
25dc0 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65  file is an in-me
25dd0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
25de0 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65  e, no action nee
25df0 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65  d.**     be take
25e00 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68  n..**.**   * Oth
25e10 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64  erwise, if the d
25e20 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
25e30 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f  upport the SAFE_
25e40 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c  APPEND property,
25e50 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65  .**     then the
25e60 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74   nRec field of t
25e70 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
25e80 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c   written journal
25e90 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69   header.**     i
25ea0 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
25eb0 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
25ec0 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  of journal recor
25ed0 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  ds that have.** 
25ee0 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e      been written
25ef0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49   following it. I
25f00 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
25f10 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c  perating in full
25f20 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64  -sync.**     mod
25f30 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
25f40 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
25f50 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  ed before this f
25f60 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e  ield is updated.
25f70 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
25f80 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
25f90 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45  t support the SE
25fa0 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74  QUENTIAL propert
25fb0 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20  y, then .**     
25fc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
25fd0 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72  synced..**.** Or
25fe0 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65  , in pseudo-code
25ff0 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f  :.**.**   if( NO
26000 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  T <in-memory jou
26010 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20  rnal> ){.**     
26020 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50  if( NOT SAFE_APP
26030 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  END ){.**       
26040 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d  if( <full-sync m
26050 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f  ode> ) xSync(<jo
26060 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
26070 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e         <update n
26080 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20  Rec field>.**   
26090 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20    } .**     if( 
260a0 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29  NOT SEQUENTIAL )
260b0 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
260c0 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a  file>);.**   }.*
260d0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
260e0 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ul, this routine
260f0 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44   clears the PGHD
26100 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
26110 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61   of every .** pa
26120 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ge currently hel
26130 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f  d in memory befo
26140 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
26150 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
26160 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63  .** error is enc
26170 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74  ountered, then t
26180 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
26190 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
261a0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
261b0 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
261c0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
261d0 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29  ger, int newHdr)
261e0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26200 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
26210 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
26220 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
26230 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
26240 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
26250 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
26260 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
26270 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
26280 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
26290 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
262a0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
262b0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
262c0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
262d0 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
262e0 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
262f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26300 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
26310 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
26320 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  oSync ){.    ass
26330 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
26340 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
26350 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
26360 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
26370 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
26380 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
26390 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
263a0 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20  const int iDc = 
263b0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
263c0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
263d0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
263e0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
263f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
26400 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
26410 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
26420 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
26430 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
26440 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74   block deals wit
26450 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f  h an obscure pro
26460 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73  blem. If the las
26470 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  t connection.   
26480 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f       ** that wro
26490 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  te to this datab
264a0 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e  ase was operatin
264b0 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d  g in persistent-
264c0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
264d0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  ** mode, then th
264e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
264f0 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ay at this point
26500 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72   actually be lar
26510 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ger.        ** t
26520 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  han Pager.journa
26530 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74  lOff bytes. If t
26540 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e  he next thing in
26550 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
26560 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70       ** file hap
26570 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75  pens to be a jou
26580 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69  rnal-header (wri
26590 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  tten as part of 
265a0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
265b0 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69  revious connecti
265c0 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  on's transaction
265d0 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f  ), and a crash o
265e0 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  r power-failure 
265f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  .        ** occu
26600 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73  rs after nRec is
26610 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66   updated but bef
26620 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ore this connect
26630 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20  ion writes .    
26640 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20      ** anything 
26650 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  else to the jour
26660 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d  nal file (or com
26670 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20  mits/rolls back 
26680 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  its .        ** 
26690 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68  transaction), th
266a0 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65  en SQLite may be
266b0 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68  come confused wh
266c0 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20  en doing the .  
266d0 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
266e0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  rnal rollback fo
266f0 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
26700 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61  . It may roll ba
26710 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  ck all.        *
26720 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  * of this connec
26730 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e  tions data, then
26740 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c   proceed to roll
26750 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64  ing back the old
26760 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  ,.        ** out
26770 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68  -of-date data th
26780 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44  at follows it. D
26790 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
267a0 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
267b0 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72         ** To wor
267c0 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69  k around this, i
267d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
267e0 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74  le does appear t
267f0 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  o contain.      
26800 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61    ** a valid hea
26810 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61  der following Pa
26820 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  ger.journalOff, 
26830 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30  then write a 0x0
26840 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  0.        ** byt
26850 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  e to the start o
26860 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20  f it to prevent 
26870 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  it from being re
26880 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20  cognized..      
26890 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
268a0 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64  Variable iNextHd
268b0 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
268c0 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20  o the offset at 
268d0 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20  which this.     
268e0 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69     ** problemati
268f0 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63  c header will oc
26900 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74  cur, if it exist
26910 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65  s. aMagic is use
26920 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  d .        ** as
26930 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
26940 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74  fer to inspect t
26950 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20  he first couple 
26960 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20  of bytes of.    
26970 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e      ** the poten
26980 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tial journal hea
26990 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  der..        */.
269a0 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78          i64 iNex
269b0 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  tHdrOffset;.    
269c0 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d      u8 aMagic[8]
269d0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65  ;.        u8 zHe
269e0 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
269f0 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a  rnalMagic)+4];..
26a00 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
26a10 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
26a20 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
26a30 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
26a40 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
26a50 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
26a60 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
26a70 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
26a80 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48  ..        iNextH
26a90 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e  drOffset = journ
26aa0 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
26ab0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
26ac0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
26ad0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
26ae0 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72  gic, 8, iNextHdr
26af0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
26b00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26b10 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  OK && 0==memcmp(
26b20 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
26b30 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20  Magic, 8) ){.   
26b40 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
26b50 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20  nst u8 zerobyte 
26b60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
26b70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
26b80 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
26b90 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e  &zerobyte, 1, iN
26ba0 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
26bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26bc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26bd0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
26be0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
26bf0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
26c00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26c10 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
26c20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
26c30 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
26c40 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
26c50 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
26c60 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
26c70 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
26c80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
26c90 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
26ca0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
26cb0 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
26cc0 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
26cd0 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
26ce0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
26cf0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
26d00 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
26d10 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20   rollback..     
26d20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
26d30 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
26d40 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72  uired if the per
26d50 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75  sistent media su
26d60 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20  pports the.     
26d70 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e     ** SAFE_APPEN
26d80 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61  D property. Beca
26d90 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  use in this case
26da0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
26db0 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble .        ** 
26dc0 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61  for garbage data
26dd0 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
26de0 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65  to the file, the
26df0 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20   nRec field.    
26e00 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61      ** is popula
26e10 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46  ted with 0xFFFFF
26e20 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  FFF when the jou
26e30 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77  rnal header is w
26e40 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a  ritten.        *
26e50 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64  * and never need
26e60 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  s to be updated.
26e70 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26e80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
26e90 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
26ea0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
26eb0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
26ec0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
26ed0 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
26ee0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
26ef0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
26f00 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
26f10 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
26f20 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
26f30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26f40 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
26f50 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
26f60 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  cFlags);.       
26f70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26f80 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
26f90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26fa0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
26fb0 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70  DR %p %lld\n", p
26fc0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
26fd0 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20  ournalHdr));.   
26fe0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26ff0 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20  3OsWrite(.      
27000 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66        pPager->jf
27010 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65  d, zHeader, size
27020 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61  of(zHeader), pPa
27030 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  ger->journalHdr.
27040 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
27050 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27060 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
27070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27080 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
27090 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
270a0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
270b0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
270c0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
270d0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
270e0 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49  er)));.        I
270f0 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
27100 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
27110 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
27120 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
27130 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
27140 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20  yncFlags| .     
27150 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
27160 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ncFlags==SQLITE_
27170 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
27180 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
27190 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
271a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
271b0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
271c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
271d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
271e0 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
271f0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
27200 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20    if( newHdr && 
27210 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
27220 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
27230 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  ) ){.        pPa
27240 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
27250 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
27260 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
27270 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
27280 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27290 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
272a0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
272b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
272c0 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
272d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
272e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e    }.  }..  /* Un
272f0 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
27300 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65  s in noSync mode
27310 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
27320 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a  le was just .  *
27330 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73  * successfully s
27340 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61  ynced. Either wa
27350 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  y, clear the PGH
27360 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
27370 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70  g on .  ** all p
27380 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ages..  */.  sql
27390 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
273a0 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
273b0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61  >pPCache);.  pPa
273c0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
273d0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
273e0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
273f0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
27400 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
27410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27420 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
27430 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
27440 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   in a linked lis
27450 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
27460 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79   connected.** by
27470 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
27480 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20  y pointer. This 
27490 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20  function writes 
274a0 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a  each one of the.
274b0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ** in-memory pag
274c0 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74  es in the list t
274d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
274e0 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ile. The argumen
274f0 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c  t may.** be NULL
27500 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61  , representing a
27510 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e  n empty list. In
27520 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
27530 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61  function is.** a
27540 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
27550 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c  e pager must hol
27560 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  d at least a RES
27570 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20  ERVED lock when 
27580 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
27590 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f   is called. Befo
275a0 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68  re writing anyth
275b0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
275c0 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c  ase file, this l
275d0 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64  ock.** is upgrad
275e0 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ed to an EXCLUSI
275f0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  VE lock. If the 
27600 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
27610 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49  btained,.** SQLI
27620 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
27630 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20  ned and no data 
27640 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
27650 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
27660 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70  .** .** If the p
27670 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66  ager is a temp-f
27680 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68  ile pager and th
27690 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79  e actual file-sy
276a0 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20  stem file.** is 
276b0 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74  not yet open, it
276c0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
276d0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e  opened before an
276e0 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72  y data is .** wr
276f0 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a  itten out..**.**
27700 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68   Once the lock h
27710 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64  as been upgraded
27720 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61   and, if necessa
27730 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65  ry, the file ope
27740 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ned,.** the page
27750 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75  s are written ou
27760 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
27770 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f  e file in list o
27780 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a  rder. Writing.**
27790 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70   a page is skipp
277a0 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65  ed if it meets e
277b0 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c  ither of the fol
277c0 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a  lowing criteria:
277d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
277e0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72  age number is gr
277f0 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72  eater than Pager
27800 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20  .dbSize, or.**  
27810 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e   * The PGHDR_DON
27820 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20  T_WRITE flag is 
27830 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  set on the page.
27840 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e  .**.** If writin
27850 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75  g out a page cau
27860 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
27870 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50   file to grow, P
27880 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a  ager.dbFileSize.
27890 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63  ** is updated ac
278a0 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61  cordingly. If pa
278b0 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20  ge 1 is written 
278c0 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  out, then the va
278d0 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e  lue cached.** in
278e0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
278f0 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74  s[] is updated t
27900 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  o match the new 
27910 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
27920 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
27930 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
27940 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
27950 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
27960 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
27970 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
27980 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f  ** occurs, an IO
27990 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
279a0 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
279b0 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
279c0 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20  ck cannot.** be 
279d0 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45  obtained, SQLITE
279e0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
279f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
27a00 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
27a10 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61  elist(Pager *pPa
27a20 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73  ger, PgHdr *pLis
27a30 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
27a40 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
27a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27a60 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
27a70 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
27a80 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
27a90 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  for rollback pag
27aa0 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42  ers in WRITER_DB
27ab0 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  MOD state. */.  
27ac0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
27ad0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
27ae0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27af0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
27b00 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a  WRITER_DBMOD );.
27b10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27b20 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
27b30 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
27b40 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
27b50 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20  a temp-file has 
27b60 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
27b70 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
27b80 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  . It.  ** is not
27b90 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63   possible for rc
27ba0 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61   to be other tha
27bb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
27bc0 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
27bd0 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67  is taken, as pag
27be0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
27bf0 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
27c00 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a   temp-files..  *
27c10 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
27c20 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
27c30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27c40 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72  r->tempFile && r
27c50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
27c60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
27c70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
27c80 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
27c90 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
27ca0 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74  }..  /* Before t
27cb0 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20  he first write, 
27cc0 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68  give the VFS a h
27cd0 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20  int of what the 
27ce0 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  final.  ** file 
27cf0 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20  size will be..  
27d00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  */.  assert( rc!
27d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
27d20 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
27d30 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
27d40 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
27d50 72 2d 3e 64 62 53 69 7a 65 3e 70 50 61 67 65 72  r->dbSize>pPager
27d60 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 7b 0a  ->dbHintSize ){.
27d70 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
27d80 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65  4 szFile = pPage
27d90 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73  r->pageSize * (s
27da0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61  qlite3_int64)pPa
27db0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
27dc0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
27dd0 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
27de0 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
27df0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73  TL_SIZE_HINT, &s
27e00 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67  zFile);.    pPag
27e10 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
27e20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
27e30 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
27e40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27e50 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e  pList ){.    Pgn
27e60 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e  o pgno = pList->
27e70 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pgno;..    /* If
27e80 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
27e90 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
27ea0 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
27eb0 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
27ec0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
27ed0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
27ee0 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
27ef0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
27f00 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
27f10 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
27f20 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
27f30 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
27f40 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
27f50 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
27f60 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
27f70 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
27f80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
27f90 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  lso, do not writ
27fa0 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74  e out any page t
27fb0 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44  hat has the PGHD
27fc0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
27fd0 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65  g.    ** set (se
27fe0 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
27ff0 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20  rDontWrite()).. 
28000 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
28010 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
28020 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
28030 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
28040 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
28050 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
28060 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
28070 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
28080 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72   /* Offset to wr
28090 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ite */.      cha
280a0 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  r *pData;       
280b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
280d0 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20  ata to write */ 
280e0 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72     ..      asser
280f0 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  t( (pList->flags
28100 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
28110 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
28120 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
28130 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63   ) pager_write_c
28140 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69  hangecounter(pLi
28150 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  st);..      /* E
28160 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61  ncode the databa
28170 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45  se */.      CODE
28180 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  C2(pPager, pList
28190 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36  ->pData, pgno, 6
281a0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
281b0 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a  NOMEM, pData);..
281c0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f        /* Write o
281d0 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ut the page data
281e0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
281f0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
28200 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
28210 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
28220 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20  ze, offset);..  
28230 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31      /* If page 1
28240 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65   was just writte
28250 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e  n, update Pager.
28260 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61  dbFileVers to ma
28270 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  tch.      ** the
28280 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65   value now store
28290 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
282a0 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69  e file. If writi
282b0 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a  ng this .      *
282c0 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68  * page caused th
282d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
282e0 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20  to grow, update 
282f0 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20  dbFileSize. .   
28300 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
28310 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
28320 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
28330 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
28340 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f  pData[24], sizeo
28350 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
28360 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
28370 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
28380 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
28390 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  e ){.        pPa
283a0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
283b0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  = pgno;.      }.
283c0 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
283d0 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65   any backup obje
283e0 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20  cts copying the 
283f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
28400 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20   pager. */.     
28410 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
28420 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
28430 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
28440 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a  )pList->pData);.
28450 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
28460 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E(("STORE %d pag
28470 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
28480 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
28490 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
284a0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
284b0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
284c0 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  st)));.      IOT
284d0 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
284e0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
284f0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
28500 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
28510 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
28520 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  unt);.      PAGE
28530 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
28540 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Write);.    }els
28550 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
28560 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
28570 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
28580 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
28590 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
285a0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
285b0 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  sh(pList);.    p
285c0 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
285d0 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  irty;.  }..  ret
285e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
285f0 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   Ensure that the
28600 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
28610 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74  e is open. If it
28620 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
28630 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
28640 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
28650 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
28660 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
28670 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
28680 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e  ccording to plan
28690 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  . An .** SQLITE_
286a0 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
286b0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
286c0 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   if a call to sq
286d0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a  lite3OsOpen() .*
286e0 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * fails..*/.stat
286f0 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f  ic int openSubJo
28700 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
28710 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
28720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
28730 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
28740 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69  ->sjfd) ){.    i
28750 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
28760 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
28770 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
28780 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   || pPager->subj
28790 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
287a0 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
287b0 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
287c0 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sjfd);.    }else
287d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
287e0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
287f0 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  r, pPager->sjfd,
28800 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
28810 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
28820 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
28830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
28840 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65   a record of the
28850 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
28860 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  f page pPg to th
28870 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a  e sub-journal. .
28880 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  ** It is the cal
28890 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
288a0 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52  ity to use subjR
288b0 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f  equiresPage() to
288c0 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20   check .** that 
288d0 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71  it is really req
288e0 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c  uired before cal
288f0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
28900 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  on..**.** If suc
28910 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
28920 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
28930 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20  ng to pPg->pgno 
28940 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a  in the bitvecs.*
28950 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73  * for all open s
28960 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65  avepoints before
28970 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
28980 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28990 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
289a0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
289b0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
289c0 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  n IO.** error co
289d0 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  de if the attemp
289e0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
289f0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61  e sub-journal fa
28a00 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49  ils, or .** SQLI
28a10 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
28a20 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65  lloc fails while
28a30 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69   setting a bit i
28a40 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  n a savepoint.**
28a50 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74   bitvec..*/.stat
28a60 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
28a70 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  lPage(PgHdr *pPg
28a80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
28a90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
28aa0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
28ab0 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
28ac0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
28ad0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
28ae0 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20  MODE_OFF ){..   
28af0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62   /* Open the sub
28b00 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20  -journal, if it 
28b10 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
28b20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  been opened */. 
28b30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
28b40 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
28b50 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
28b60 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
28b70 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28   || pagerUseWal(
28b80 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61  pPager) );.    a
28b90 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
28ba0 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70  ager->sjfd) || p
28bb0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d  Pager->nSubRec==
28bc0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
28bd0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
28be0 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c  ger) .         |
28bf0 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  | pageInJournal(
28c00 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c  pPg) .         |
28c10 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
28c20 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
28c30 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
28c40 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
28c50 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  Pager);..    /* 
28c60 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  If the sub-journ
28c70 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75  al was opened su
28c80 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77  ccessfully (or w
28c90 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  as already open)
28ca0 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74  ,.    ** write t
28cb0 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
28cc0 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  d into the file.
28cd0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
28ce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28cf0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
28d00 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
28d10 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
28d20 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53   (i64)pPager->nS
28d30 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
28d40 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
28d50 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
28d60 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
28d70 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
28d80 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
28d90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
28da0 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
28db0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
28dc0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
28dd0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
28de0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
28df0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
28e00 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
28e10 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
28e20 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
28e30 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
28e40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28e50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28e60 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
28e70 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
28e80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
28e90 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
28ea0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
28eb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28ec0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
28ed0 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
28ee0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
28ef0 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
28f00 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
28f10 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
28f20 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
28f30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28f40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
28f50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
28f60 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
28f70 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
28f80 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
28f90 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
28fa0 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
28fb0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
28fc0 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
28fd0 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
28fe0 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
28ff0 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
29000 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
29010 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
29020 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
29030 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
29040 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
29050 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
29060 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
29070 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
29080 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
29090 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
290a0 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
290b0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
290c0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
290d0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
290e0 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
290f0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
29100 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
29110 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
29120 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
29130 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
29140 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
29150 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
29160 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
29170 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
29180 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
29190 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
291a0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
291b0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
291c0 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
291d0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
291e0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
291f0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
29200 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
29210 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
29220 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
29230 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
29240 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
29250 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
29260 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
29270 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
29280 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
29290 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
292a0 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
292b0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
292c0 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
292d0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
292e0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
292f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
29300 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
29310 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
29320 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
29330 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
29340 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29350 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
29360 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
29370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29380 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
29390 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
293a0 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  e doNotSyncSpill
293b0 20 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72   flag is set dur
293c0 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64  ing times when d
293d0 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20  oing a sync of. 
293e0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64   ** journal (and
293f0 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65   adding a new he
29400 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c  ader) is not all
29410 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75  owed.  This occu
29420 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63  rs.  ** during c
29430 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
29440 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c  agerWrite() whil
29450 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72  e trying to jour
29460 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a  nal multiple.  *
29470 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e  * pages belongin
29480 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65  g to the same se
29490 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ctor..  **.  ** 
294a0 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66  The doNotSpill f
294b0 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c  lag inhibits all
294c0 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20   cache spilling 
294d0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
294e0 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f  ether.  ** or no
294f0 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75  t a sync is requ
29500 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  ired.  This is s
29510 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  et during a roll
29520 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
29530 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f  Spilling is also
29540 20 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e   prohibited when
29550 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
29560 74 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f  te since that co
29570 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f  uld.  ** lead to
29580 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
29590 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63  tion.   In the c
295a0 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
295b0 61 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73  aton it .  ** is
295c0 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
295d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
295e0 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65  ch() to be calle
295f0 64 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  d with createFla
29600 67 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20  g==1.  ** while 
29610 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
29620 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20  te, hence it is 
29630 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  impossible for t
29640 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20  his routine to. 
29650 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e   ** be called in
29660 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
29670 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
29680 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45   we include a NE
29690 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20  VER().  ** test 
296a0 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  for the error st
296b0 61 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61  ate as a safegua
296c0 72 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72  rd against futur
296d0 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a  e changes..  */.
296e0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
296f0 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
29700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29710 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
29720 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74 75  oNotSpill ) retu
29730 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
29740 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
29750 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28 70  tSyncSpill && (p
29760 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
29770 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
29780 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
29790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
297a0 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
297b0 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
297c0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
297d0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e    /* Write a sin
297e0 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68  gle frame for th
297f0 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c  is page to the l
29800 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  og. */.    if( s
29810 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
29820 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72  pPg) ){ .      r
29830 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
29840 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a  ge(pPg); .    }.
29850 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29860 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
29870 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d  c = pagerWalFram
29880 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  es(pPager, pPg, 
29890 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
298a0 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
298b0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
298c0 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
298d0 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  d. */.    if( pP
298e0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
298f0 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c  EED_SYNC .     |
29900 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
29910 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
29920 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20  ACHEMOD.    ){. 
29930 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
29940 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29  urnal(pPager, 1)
29950 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
29960 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
29970 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67  mber of this pag
29980 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
29990 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
299a0 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
299b0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
299c0 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  it may need to b
299d0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
299e0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20   sub-journal..  
299f0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
29a00 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
29a10 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
29a20 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69  elist() below wi
29a30 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63  ll not.    ** ac
29a40 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74  tually write dat
29a50 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e  a to the file in
29a60 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
29a70 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64  **.    ** Consid
29a80 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
29a90 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65   sequence of eve
29aa0 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nts:.    **.    
29ab0 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  **   BEGIN;.    
29ac0 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20  **     <journal 
29ad0 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
29ae0 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20     <modify page 
29af0 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41  X>.    **     SA
29b00 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20  VEPOINT sp;.    
29b10 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b  **       <shrink
29b20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
29b30 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a  o Y pages>.    *
29b40 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72  *       pagerStr
29b50 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20  ess(page X).    
29b60 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  **     ROLLBACK 
29b70 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20  TO sp;.    **.  
29b80 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74    ** If (X>Y), t
29b90 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74  hen when pagerSt
29ba0 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70  ress is called p
29bb0 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62  age X will not b
29bc0 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a  e written.    **
29bd0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
29be0 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77  base file, but w
29bf0 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66  ill be dropped f
29c00 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54  rom the cache. T
29c10 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c  hen,.    ** foll
29c20 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42  owing the "ROLLB
29c30 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65  ACK TO sp" state
29c40 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61  ment, reading pa
29c50 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20  ge X will read. 
29c60 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20     ** data from 
29c70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29c80 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  e. This will be 
29c90 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65  the copy of page
29ca0 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20   X as it.    ** 
29cb0 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61  was when the tra
29cc0 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
29cd0 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20  , not as it was 
29ce0 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20  when "SAVEPOINT 
29cf0 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65  sp".    ** was e
29d00 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  xecuted..    **.
29d10 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74      ** The solut
29d20 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20  ion is to write 
29d30 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
29d40 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f   for page X into
29d50 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62   the .    ** sub
29d60 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f  -journal file no
29d70 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  w (if it is not 
29d80 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20  already there), 
29d90 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a  so that it will.
29da0 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72      ** be restor
29db0 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e  ed to its curren
29dc0 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65  t value when the
29dd0 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
29de0 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65  " is .    ** exe
29df0 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cuted..    */.  
29e00 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20    if( NEVER(.   
29e10 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
29e20 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e  OK && pPg->pgno>
29e30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
29e40 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
29e50 67 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b  ge(pPg).    ) ){
29e60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
29e70 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
29e80 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
29e90 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
29ea0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
29eb0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
29ec0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
29ed0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29ee0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
29ef0 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  rt( (pPg->flags&
29f00 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
29f10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
29f20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
29f30 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70  gelist(pPager, p
29f40 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
29f50 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
29f60 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a  ge as clean. */.
29f70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29f80 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52  _OK ){.    PAGER
29f90 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25  TRACE(("STRESS %
29fa0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
29fb0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
29fc0 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
29fd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
29fe0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
29ff0 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ..  return pager
2a000 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
2a010 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  c); .}.../*.** A
2a020 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
2a030 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67  ialize a new Pag
2a040 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75  er object and pu
2a050 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  t a pointer to i
2a060 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72  t.** in *ppPager
2a070 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75  . The pager shou
2a080 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  ld eventually be
2a090 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e   freed by passin
2a0a0 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  g it.** to sqlit
2a0b0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a  e3PagerClose()..
2a0c0 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
2a0d0 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
2a0e0 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
2a0f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2a100 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69   open..** If zFi
2a110 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
2a120 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
2a130 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
2a140 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
2a150 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
2a160 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
2a170 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66  hed. Temporary f
2a180 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65  iles are be dele
2a190 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
2a1a0 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61  ally when they a
2a1b0 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46  re closed. If zF
2a1c0 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
2a1d0 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61  ory:" then .** a
2a1e0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
2a1f0 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
2a200 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
2a210 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a  tten to disk. .*
2a220 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73  * This can be us
2a230 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
2a240 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2a250 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
2a260 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65   nExtra paramete
2a270 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  r specifies the 
2a280 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2a290 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
2a2a0 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68  ed.** along with
2a2b0 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72   each page refer
2a2c0 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65  ence. This space
2a2d0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f   is available to
2a2e0 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61   the user.** via
2a2f0 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
2a300 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e  rGetExtra() API.
2a310 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
2a320 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65   argument is use
2a330 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f  d to specify pro
2a340 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66  perties that aff
2a350 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  ect the.** opera
2a360 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
2a370 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  r. It should be 
2a380 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77  passed some bitw
2a390 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a  ise combination.
2a3a0 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f  ** of the PAGER_
2a3b0 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
2a3c0 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
2a3d0 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  CK flags..**.** 
2a3e0 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72  The vfsFlags par
2a3f0 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
2a400 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74  ask to pass to t
2a410 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2a420 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70  er.** of the xOp
2a430 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  en() method of t
2a440 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20  he supplied VFS 
2a450 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c  when opening fil
2a460 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es. .**.** If th
2a470 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e pager object i
2a480 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
2a490 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2a4a0 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75  le opened .** su
2a4b0 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49  ccessfully, SQLI
2a4c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2a4d0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73  d and *ppPager s
2a4e0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
2a4f0 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20  * the new pager 
2a500 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
2a510 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50  ror occurs, *ppP
2a520 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e  ager is set to N
2a530 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72  ULL.** and error
2a540 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
2a550 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2a560 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2a570 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65  NOMEM.** (sqlite
2a580 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65  3Malloc() is use
2a590 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
2a5a0 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41  mory), SQLITE_CA
2a5b0 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61  NTOPEN or .** va
2a5c0 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f  rious SQLITE_IO_
2a5d0 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69  XXX errors..*/.i
2a5e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
2a5f0 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
2a600 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2a610 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
2a620 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
2a630 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
2a640 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2a650 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74  /* OUT: Return t
2a660 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2a670 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2a680 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2a690 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
2a6a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a6b0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2a6c0 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
2a6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2a6e0 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
2a6f0 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
2a700 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
2a710 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2a720 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
2a730 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
2a740 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
2a750 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2a760 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
2a770 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
2a780 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2a790 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2a7a0 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a  nit)(DbPage*) /*
2a7b0 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69   Function to rei
2a7c0 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20  nitialize pages 
2a7d0 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
2a7e0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2a7f0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
2a800 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  Pager object to 
2a810 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  allocate and ret
2a820 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
2a830 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2a840 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2a850 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   */.  int tempFi
2a860 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  le = 0;        /
2a870 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20  * True for temp 
2a880 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d  files (incl. in-
2a890 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f  memory files) */
2a8a0 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
2a8b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2a8c0 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2a8d0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2a8e0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   */.  int readOn
2a8f0 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ly = 0;        /
2a900 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2a910 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69  s a read-only fi
2a920 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72  le */.  int jour
2a930 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20  nalFileSize;    
2a940 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2a950 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a  ocate for each j
2a960 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63  ournal fd */.  c
2a970 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
2a980 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20   0;     /* Full 
2a990 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65  path to database
2a9a0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
2a9b0 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2a9c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2a9d0 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e   bytes in zPathn
2a9e0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ame */.  int use
2a9f0 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
2aa00 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
2aa10 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61  URNAL)==0; /* Fa
2aa20 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72  lse to omit jour
2aa30 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52  nal */.  int noR
2aa40 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73  eadlock = (flags
2aa50 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44   & PAGER_NO_READ
2aa60 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72  LOCK)!=0;  /* Tr
2aa70 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d  ue to omit read-
2aa80 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63  lock */.  int pc
2aa90 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  acheSize = sqlit
2aaa0 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20  e3PcacheSize(); 
2aab0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
2aac0 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50  o allocate for P
2aad0 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73  Cache */.  u32 s
2aae0 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2aaf0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2ab00 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c  SIZE;  /* Defaul
2ab10 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  t page size */. 
2ab20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
2ab30 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49  i = 0;    /* URI
2ab40 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f   args to copy */
2ab50 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b  .  int nUri = 0;
2ab60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ab70 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2ab80 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a  f URI args at *z
2ab90 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  Uri */..  /* Fig
2aba0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
2abb0 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
2abc0 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  ed for each jour
2abd0 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a  nal file-handle.
2abe0 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20    ** (there are 
2abf0 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65  two of them, the
2ac00 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
2ac10 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  d the sub-journa
2ac20 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73  l). This.  ** is
2ac30 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61   the maximum spa
2ac40 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
2ac50 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
2ac60 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2ac70 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67   .  ** and a reg
2ac80 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
2ac90 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74  e-handle. Note t
2aca0 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a  hat a "regular j
2acb0 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20  ournal-handle". 
2acc0 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61   ** may be a wra
2acd0 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20  pper capable of 
2ace0 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72 73  caching the firs
2acf0 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  t portion of the
2ad00 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
2ad10 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20  le in memory to 
2ad20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74  implement the at
2ad30 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2ad40 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20  ization (see .  
2ad50 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a  ** source file j
2ad60 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a  ournal.c)..  */.
2ad70 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75    if( sqlite3Jou
2ad80 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73  rnalSize(pVfs)>s
2ad90 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
2ada0 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f  Size() ){.    jo
2adb0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
2adc0 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f  ROUND8(sqlite3Jo
2add0 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29  urnalSize(pVfs))
2ade0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a  ;.  }else{.    j
2adf0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2ae00 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d   ROUND8(sqlite3M
2ae10 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29  emJournalSize())
2ae20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
2ae30 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
2ae40 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63  ble to NULL in c
2ae50 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
2ae60 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67  urs. */.  *ppPag
2ae70 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66  er = 0;..#ifndef
2ae80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
2ae90 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67  ORYDB.  if( flag
2aea0 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59  s & PAGER_MEMORY
2aeb0 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20   ){.    memDb = 
2aec0 31 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  1;.    zFilename
2aed0 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
2aee0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
2aef0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
2af00 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
2af10 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
2af20 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
2af30 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
2af40 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
2af50 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
2af60 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2af70 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
2af80 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
2af90 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
2afa0 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
2afb0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2afc0 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2afd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
2afe0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2aff0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2b000 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d  +1;.    zPathnam
2b010 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
2b020 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a  c(nPathname*2);.
2b030 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2b040 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
2b050 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2b060 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61  M;.    }.    zPa
2b070 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
2b080 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
2b090 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
2b0a0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
2b0b0 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ails */.    rc =
2b0c0 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
2b0d0 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
2b0e0 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
2b0f0 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
2b100 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
2b110 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2b120 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Pathname);.    z
2b130 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65   = zUri = &zFile
2b140 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  name[sqlite3Strl
2b150 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
2b160 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  1];.    while( *
2b170 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  z ){.      z += 
2b180 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2b190 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d  z)+1;.      z +=
2b1a0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2b1b0 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  (z)+1;.    }.   
2b1c0 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26 7a   nUri = (int)(&z
2b1d0 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20  [1] - zUri);.   
2b1e0 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d 30   assert( nUri>=0
2b1f0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
2b200 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61  SQLITE_OK && nPa
2b210 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d  thname+8>pVfs->m
2b220 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  xPathname ){.   
2b230 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2b240 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
2b250 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68  the journal path
2b260 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
2b270 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
2b280 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  se being opened 
2b290 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61  will be more tha
2b2a0 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  n pVfs->mxPathna
2b2b0 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
2b2c0 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
2b2d0 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  s means the data
2b2e0 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f  base cannot be o
2b2f0 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  pened,.      ** 
2b300 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
2b310 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
2b320 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2b330 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20  ile or even.    
2b340 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61    ** check for a
2b350 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66   hot-journal bef
2b360 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  ore reading..   
2b370 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2b380 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2b390 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2b3a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b3b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
2b3c0 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
2b3d0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
2b3e0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
2b3f0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
2b400 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61  emory for the Pa
2b410 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50  ger structure, P
2b420 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68  Cache object, th
2b430 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c  e.  ** three fil
2b440 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74  e descriptors, t
2b450 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b460 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f   name and the jo
2b470 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
2b480 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75   name. The layou
2b490 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61  t in memory is a
2b4a0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
2b4b0 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f    **     Pager o
2b4c0 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2b4d0 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
2b4e0 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20  (Pager) bytes). 
2b4f0 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f   **     PCache o
2b500 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2b510 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2b520 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74  PcacheSize() byt
2b530 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2b540 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
2b550 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56  e            (pV
2b560 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74  fs->szOsFile byt
2b570 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62  es).  **     Sub
2b580 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61  -journal file ha
2b590 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f  ndle         (jo
2b5a0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2b5b0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61  tes).  **     Ma
2b5c0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
2b5d0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a  handle        (j
2b5e0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
2b5f0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2b600 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2b610 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  e              (
2b620 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65  nPathname+1 byte
2b630 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72  s).  **     Jour
2b640 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  nal file name   
2b650 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2b660 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73  thname+8+1 bytes
2b670 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20  ).  */.  pPtr = 
2b680 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  (u8 *)sqlite3Mal
2b690 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55  locZero(.    ROU
2b6a0 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2b6b0 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50  er)) +      /* P
2b6c0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
2b6d0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61  /.    ROUND8(pca
2b6e0 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20  cheSize) +      
2b6f0 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
2b700 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55  bject */.    ROU
2b710 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2b720 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54  le) +       /* T
2b730 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  he main db file 
2b740 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
2b750 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20  leSize * 2 +    
2b760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f        /* The two
2b770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
2b780 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  / .    nPathname
2b790 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20   + 1 + nUri +   
2b7a0 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
2b7b0 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e  me */.    nPathn
2b7c0 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20  ame + 8 + 2     
2b7d0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75           /* zJou
2b7e0 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rnal */.#ifndef 
2b7f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2b800 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20      + nPathname 
2b810 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20  + 4 + 2         
2b820 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65     /* zWal */.#e
2b830 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65  ndif.  );.  asse
2b840 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2b850 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f  LIGNMENT(SQLITE_
2b860 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e  INT_TO_PTR(journ
2b870 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a  alFileSize)) );.
2b880 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
2b890 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2b8a0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2b8b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b8c0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MEM;.  }.  pPage
2b8d0 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  r =             
2b8e0 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b   (Pager*)(pPtr);
2b8f0 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  .  pPager->pPCac
2b900 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a  he =    (PCache*
2b910 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2b920 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2b930 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ));.  pPager->fd
2b940 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69   =   (sqlite3_fi
2b950 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2b960 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29  ND8(pcacheSize))
2b970 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  ;.  pPager->sjfd
2b980 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
2b990 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2b9a0 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2b9b0 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  ));.  pPager->jf
2b9c0 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69  d =  (sqlite3_fi
2b9d0 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  le*)(pPtr += jou
2b9e0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
2b9f0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2ba00 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28  me =    (char*)(
2ba10 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
2ba20 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  ileSize);.  asse
2ba30 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2ba40 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d  LIGNMENT(pPager-
2ba50 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  >jfd) );..  /* F
2ba60 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72  ill in the Pager
2ba70 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50  .zFilename and P
2ba80 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75  ager.zJournal bu
2ba90 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72  ffers, if requir
2baa0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  ed. */.  if( zPa
2bab0 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  thname ){.    as
2bac0 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e  sert( nPathname>
2bad0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
2bae0 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63  >zJournal =   (c
2baf0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50  har*)(pPtr += nP
2bb00 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55  athname + 1 + nU
2bb10 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ri);.    memcpy(
2bb20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2bb30 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  e, zPathname, nP
2bb40 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2bb50 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46  mcpy(&pPager->zF
2bb60 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d  ilename[nPathnam
2bb70 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69  e+1], zUri, nUri
2bb80 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2bb90 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2bba0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2bbb0 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2bbc0 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
2bbd0 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
2bbe0 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20  "-journal\000", 
2bbf0 38 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  8+1);.    sqlite
2bc00 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61  3FileSuffix3(pPa
2bc10 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2bc20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2bc30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2bc40 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70  E_OMIT_WAL.    p
2bc50 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70  Pager->zWal = &p
2bc60 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2bc70 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a  nPathname+8+1];.
2bc80 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2bc90 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61  r->zWal, zPathna
2bca0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2bcb0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2bcc0 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61  er->zWal[nPathna
2bcd0 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c  me], "-wal\000",
2bce0 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74   4+1);.    sqlit
2bcf0 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50  e3FileSuffix3(pP
2bd00 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2bd10 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a   pPager->zWal);.
2bd20 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2bd30 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
2bd40 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
2bd50 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2bd60 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
2bd70 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
2bd80 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
2bd90 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
2bda0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2bdb0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2bdc0 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20  .    int fout = 
2bdd0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2bde0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2bdf0 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  gs returned by x
2be00 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63  Open() */.    rc
2be10 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2be20 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2be30 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2be40 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20  ->fd, vfsFlags, 
2be50 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65  &fout);.    asse
2be60 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20  rt( !memDb );.  
2be70 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
2be80 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2be90 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
2bea0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
2beb0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
2bec0 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
2bed0 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
2bee0 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
2bef0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2bf00 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
2bf10 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
2bf20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
2bf30 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
2bf40 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
2bf50 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
2bf60 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
2bf70 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2bf80 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
2bf90 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
2bfa0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2bfb0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
2bfc0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2bfd0 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
2bfe0 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
2bff0 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
2c000 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
2c010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c020 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
2c030 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
2c040 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
2c050 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2c060 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2c070 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
2c080 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2c090 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50  );.      if( szP
2c0a0 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e  ageDflt<pPager->
2c0b0 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  sectorSize ){.  
2c0c0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2c0d0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
2c0e0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2c0f0 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
2c100 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2c110 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
2c120 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2c130 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2c140 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
2c150 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61  eDflt = (u32)pPa
2c160 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
2c170 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c180 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2c190 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2c1a0 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20  RITE.      {.   
2c1b0 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
2c1c0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2c1d0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2c1e0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
2c1f0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
2c200 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2c210 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
2c220 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
2c230 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2c240 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
2c250 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
2c260 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2c270 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2c280 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
2c290 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  536);.        fo
2c2a0 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
2c2b0 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
2c2c0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2c2d0 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
2c2e0 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
2c2f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2c300 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
2c310 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2c320 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
2c330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c340 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
2c350 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  f.    }.  }else{
2c360 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d  .    /* If a tem
2c370 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72  porary file is r
2c380 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
2c390 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64  not opened immed
2c3a0 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49  iately..    ** I
2c3b0 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61  n this case we a
2c3c0 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c  ccept the defaul
2c3d0 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
2c3e0 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20  delay actually. 
2c3f0 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68     ** opening th
2c400 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
2c410 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f   first call to O
2c420 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a  sWrite()..    **
2c430 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
2c440 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20  nch is also run 
2c450 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
2c460 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e   database. An in
2c470 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64  -memory.    ** d
2c480 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73  atabase is the s
2c490 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69  ame as a temp-fi
2c4a0 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72  le that is never
2c4b0 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
2c4c0 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20      ** disk and 
2c4d0 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  uses an in-memor
2c4e0 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  y rollback journ
2c4f0 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  al..    */ .    
2c500 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
2c510 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2c520 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
2c530 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f  .    pPager->eLo
2c540 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  ck = EXCLUSIVE_L
2c550 4f 43 4b 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  OCK;.    readOnl
2c560 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
2c570 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2c580 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
2c590 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
2c5a0 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
2c5b0 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
2c5c0 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
2c5d0 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
2c5e0 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
2c5f0 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
2c600 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
2c610 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
2c620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c630 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2c640 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
2c650 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c660 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2c670 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
2c680 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
2c690 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
2c6a0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
2c6b0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2c6c0 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74 68  occurred in eith
2c6d0 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
2c6e0 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
2c6f0 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72   .  ** Pager str
2c700 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
2c710 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
2c720 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c730 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2c740 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70  t( !pPager->pTmp
2c750 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c  Space );.    sql
2c760 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
2c770 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
2c780 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
2c790 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2c7a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
2c7b0 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
2c7c0 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61  e object. */.  a
2c7d0 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30  ssert( nExtra<10
2c7e0 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d  00 );.  nExtra =
2c7f0 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b   ROUND8(nExtra);
2c800 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
2c810 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
2c820 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
2c830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c840 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
2c850 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
2c860 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
2c870 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20  r->pPCache);..  
2c880 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45  PAGERTRACE(("OPE
2c890 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45  N %d %s\n", FILE
2c8a0 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d  HANDLEID(pPager-
2c8b0 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46  >fd), pPager->zF
2c8c0 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54  ilename));.  IOT
2c8d0 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
2c8e0 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  s\n", pPager, pP
2c8f0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2c900 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  )..  pPager->use
2c910 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73  Journal = (u8)us
2c920 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67  eJournal;.  pPag
2c930 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
2c940 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20   (noReadlock && 
2c950 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a  readOnly) ?1:0;.
2c960 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2c970 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
2c980 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
2c990 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
2c9a0 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
2c9b0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2c9c0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
2c9d0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2c9e0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
2c9f0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2ca00 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
2ca10 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
2ca20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
2ca30 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
2ca40 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
2ca50 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23  GER_UNLOCK; */.#
2ca60 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
2ca70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20  Pager->state == 
2ca80 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45  (tempFile ? PAGE
2ca90 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41  R_EXCLUSIVE : PA
2caa0 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 23  GER_UNLOCK) );.#
2cab0 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65  endif.  /* pPage
2cac0 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
2cad0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
2cae0 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70  pFile = (u8)temp
2caf0 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
2cb00 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
2cb10 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2cb20 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
2cb30 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
2cb40 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2cb50 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
2cb60 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
2cb70 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
2cb80 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
2cb90 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
2cba0 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20  (u8)tempFile; . 
2cbb0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
2cbc0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
2cbd0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
2cbe0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28  Pager->memDb = (
2cbf0 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  u8)memDb;.  pPag
2cc00 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28  er->readOnly = (
2cc10 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61  u8)readOnly;.  a
2cc20 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61  ssert( useJourna
2cc30 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  l || pPager->tem
2cc40 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65  pFile );.  pPage
2cc50 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
2cc60 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
2cc70 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
2cc80 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
2cc90 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
2cca0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nc==0 );.    ass
2ccb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e  ert( pPager->syn
2ccc0 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  cFlags==0 );.   
2ccd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2cce0 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30  >walSyncFlags==0
2ccf0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2cd00 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
2cd10 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65  Flags==0 );.  }e
2cd20 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
2cd30 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20  >fullSync = 1;. 
2cd40 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
2cd50 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2cd60 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
2cd70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2cd80 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2cd90 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53  C_NORMAL | WAL_S
2cda0 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
2cdb0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
2cdc0 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
2cdd0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2cde0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
2cdf0 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
2ce00 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2ce10 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
2ce20 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2ce30 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
2ce40 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
2ce50 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20  = (u16)nExtra;. 
2ce60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2ce70 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49  SizeLimit = SQLI
2ce80 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e  TE_DEFAULT_JOURN
2ce90 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20  AL_SIZE_LIMIT;. 
2cea0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2ceb0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74  pPager->fd) || t
2cec0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74  empFile );.  set
2ced0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
2cee0 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f  r);.  if( !useJo
2cef0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61  urnal ){.    pPa
2cf00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2cf10 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2cf20 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  MODE_OFF;.  }els
2cf30 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20  e if( memDb ){. 
2cf40 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2cf50 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
2cf60 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2cf70 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  Y;.  }.  /* pPag
2cf80 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
2cf90 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2cfa0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
2cfb0 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20  erArg = 0; */.  
2cfc0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
2cfd0 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f  r = xReinit;.  /
2cfe0 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
2cff0 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
2d000 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
2d010 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65  ); */..  *ppPage
2d020 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
2d030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d040 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }..../*.** This 
2d050 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2d060 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74  ed after transit
2d070 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45  ioning from PAGE
2d080 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50  R_UNLOCK to.** P
2d090 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
2d0a0 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74  e. It tests if t
2d0b0 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
2d0c0 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e  urnal present in
2d0d0 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73  .** the file-sys
2d0e0 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65  tem for the give
2d0f0 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a  n pager. A hot j
2d100 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
2d110 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  at .** needs to 
2d120 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  be played back. 
2d130 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69  According to thi
2d140 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f  s function, a ho
2d150 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
2d160 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  e exists if the 
2d170 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
2d180 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ia are met:.**.*
2d190 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61  *   * The journa
2d1a0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e  l file exists in
2d1b0 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
2d1c0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20  , and.**   * No 
2d1d0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
2d1e0 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2d1f0 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
2d200 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
2d210 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  nd.**   * The da
2d220 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
2d230 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68  lf is greater th
2d240 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
2d250 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ze, and.**   * T
2d260 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
2d270 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d280 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20  e exists and is 
2d290 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20  not 0x00..**.** 
2d2a0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
2d2b0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2d2c0 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
2d2d0 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
2d2e0 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
2d2f0 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
2d300 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
2d310 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
2d320 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
2d330 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
2d340 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
2d350 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d360 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65   is.** just dele
2d370 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65  ted using OsDele
2d380 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  te, *pExists is 
2d390 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
2d3a0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
2d3b0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
2d3c0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
2d3d0 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72  ot check if ther
2d3e0 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  e is a master jo
2d3f0 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a  urnal filename.*
2d400 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
2d410 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
2d420 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20  re is, and that 
2d430 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2d440 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ile.** does not 
2d450 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20  exist, then the 
2d460 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2d470 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20  not really hot. 
2d480 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
2d490 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
2d4a0 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65  l return a false
2d4b0 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70  -positive. The p
2d4c0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a  ager_playback().
2d4d0 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  ** routine will 
2d4e0 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68  discover that th
2d4f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2d500 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2d510 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f   and .** will no
2d520 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  t roll it back. 
2d530 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d  .**.** If a hot-
2d540 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2d550 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20  found to exist, 
2d560 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
2d570 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  to 1 and .** SQL
2d580 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2d590 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e   If no hot-journ
2d5a0 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
2d5b0 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a  nt, *pExists is.
2d5c0 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  ** set to 0 and 
2d5d0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2d5e0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2d5f0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2d600 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74  trying.** to det
2d610 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
2d620 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72  r not a hot-jour
2d630 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
2d640 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a   the IO error.**
2d650 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2d660 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
2d670 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75  of *pExists is u
2d680 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
2d690 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
2d6a0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
2d6b0 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74  ger, int *pExist
2d6c0 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
2d6d0 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
2d6e0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
2d6f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d700 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  _OK;           /
2d710 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2d720 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20  .  int exists = 
2d730 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2d740 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f   /* True if a jo
2d750 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2d760 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a  esent */.  int j
2d770 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70  rnlOpen = !!isOp
2d780 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
2d790 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2d7a0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2d7b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2d7c0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2d7d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2d7e0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2d7f0 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73  R_OPEN );..  ass
2d800 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30  ert( jrnlOpen==0
2d810 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44   || ( sqlite3OsD
2d820 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2d830 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  tics(pPager->jfd
2d840 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49  ) &.    SQLITE_I
2d850 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
2d860 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b  _WHEN_OPEN.  ));
2d870 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30  ..  *pExists = 0
2d880 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65  ;.  if( !jrnlOpe
2d890 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
2d8a0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
2d8b0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2d8c0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
2d8d0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
2d8e0 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  sts);.  }.  if( 
2d8f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d900 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69   exists ){.    i
2d910 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20  nt locked = 0;  
2d920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2d930 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65  ue if some proce
2d940 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
2d950 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20  VED lock */..   
2d960 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69   /* Race conditi
2d970 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65  on here:  Anothe
2d980 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
2d990 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e  have been holdin
2d9a0 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65  g the.    ** the
2d9b0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
2d9c0 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61  nd have a journa
2d9d0 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71  l open at the sq
2d9e0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
2d9f0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f  .    ** call abo
2da00 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c  ve, but then del
2da10 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
2da20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63  and drop the loc
2da30 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  k before.    ** 
2da40 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f  we get to the fo
2da50 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f  llowing sqlite3O
2da60 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
2da70 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74  ck() call.  If t
2da80 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  hat.    ** is th
2da90 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75  e case, this rou
2daa0 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b  tine might think
2dab0 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
2dac0 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20  journal when.   
2dad0 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72   ** in fact ther
2dae0 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73  e is none.  This
2daf0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61   results in a fa
2db00 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69  lse-positive whi
2db10 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ch will.    ** b
2db20 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
2db30 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75  the playback rou
2db40 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33  tine.  Ticket #3
2db50 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  883..    */.    
2db60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68  rc = sqlite3OsCh
2db70 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2db80 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63  pPager->fd, &loc
2db90 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ked);.    if( rc
2dba0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2dbb0 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20  locked ){.      
2dbc0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
2dbd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2dbe0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2dbf0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
2dc00 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  */..      /* Che
2dc10 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ck the size of t
2dc20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2dc30 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73  . If it consists
2dc40 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20   of 0 pages,.   
2dc50 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74     ** then delet
2dc60 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2dc70 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65 61 64  le. See the head
2dc80 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  er comment above
2dc90 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74   for .      ** t
2dca0 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72  he reasoning her
2dcb0 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f  e.  Delete the o
2dcc0 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
2dcd0 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20  file under.     
2dce0 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c   ** a RESERVED l
2dcf0 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63  ock to avoid rac
2dd00 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64  e conditions and
2dd10 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74   to avoid violat
2dd20 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33  ing.      ** [H3
2dd30 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a  3020]..      */.
2dd40 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2dd50 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2dd60 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
2dd70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2dd80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
2dd90 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
2dda0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
2ddb0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
2ddc0 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ();.          if
2ddd0 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  ( pagerLockDb(pP
2dde0 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
2ddf0 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  OCK)==SQLITE_OK 
2de00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2de10 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
2de20 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2de30 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
2de40 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2de50 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2de60 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  e ) pagerUnlockD
2de70 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
2de80 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
2de90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2dea0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
2deb0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
2dec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2ded0 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
2dee0 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2def0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
2df00 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76  ion has a reserv
2df10 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2df20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2df30 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2df40 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20  file. Now check 
2df50 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20  that there is.  
2df60 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65          ** at le
2df70 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f  ast one non-zero
2df80 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74   bytes at the st
2df90 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
2dfa0 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
2dfb0 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
2dfc0 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69  s, then we consi
2dfd0 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  der this journal
2dfe0 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e   to be hot. If n
2dff0 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ot, .          *
2e000 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f  * it can be igno
2e010 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  red..          *
2e020 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2e030 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
2e040 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
2e050 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2e060 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
2e070 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
2e080 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2e090 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
2e0a0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2e0b0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
2e0c0 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20  fd, f, &f);.    
2e0d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e0e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e0f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2e100 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b     u8 first = 0;
2e110 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2e120 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
2e130 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f  pPager->jfd, (vo
2e140 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20  id *)&first, 1, 
2e150 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2e160 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
2e170 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
2e180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2e1b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2e1c0 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2e1d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e1e0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2e1f0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
2e200 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2e210 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72   *pExists = (fir
2e220 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  st!=0);.        
2e230 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
2e240 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
2e250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2e260 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  * If we cannot o
2e270 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  pen the rollback
2e280 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
2e290 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66   order to see if
2e2a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2e2b0 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68  its has a zero h
2e2c0 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68  eader, that migh
2e2d0 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49  t be due to an I
2e2e0 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20  /O error, or.   
2e2f0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d           ** it m
2e300 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74  ight be due to t
2e310 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  he race conditio
2e320 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  n described abov
2e330 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20  e and in.       
2e340 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23       ** ticket #
2e350 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61  3883.  Either wa
2e360 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  y, assume that t
2e370 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
2e380 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
2e390 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20  * This might be 
2e3a0 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
2e3b0 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c  .  But if it is,
2e3c0 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20   then the.      
2e3d0 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74        ** automat
2e3e0 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62  ic journal playb
2e3f0 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79  ack and recovery
2e400 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20   mechanism will 
2e410 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20  deal.           
2e420 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65   ** with it unde
2e430 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  r an EXCLUSIVE l
2e440 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20  ock where we do 
2e450 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  not need to.    
2e460 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79          ** worry
2e470 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61   so much with ra
2e480 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20  ce conditions.. 
2e490 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2e4a0 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
2e4b0 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ts = 1;.        
2e4c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e4d0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2e4e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e4f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
2e500 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2e510 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2e520 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
2e530 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
2e540 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2e550 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69  se file..** It i
2e560 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  s illegal to cal
2e570 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  l sqlite3PagerAc
2e580 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66  quire() until af
2e590 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
2e5a0 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
2e5b0 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
2e5c0 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
2e5d0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
2e5e0 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
2e5f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2e600 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
2e610 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
2e620 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
2e630 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
2e640 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
2e650 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
2e660 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
2e670 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
2e680 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
2e690 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
2e6a0 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
2e6b0 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
2e6c0 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
2e6d0 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
2e6e0 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
2e6f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2e700 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
2e710 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
2e720 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
2e730 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
2e740 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2e750 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
2e760 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
2e770 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
2e780 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
2e790 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
2e7a0 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
2e7b0 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
2e7c0 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
2e7d0 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
2e7e0 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
2e7f0 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
2e800 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
2e810 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
2e820 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e830 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
2e840 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
2e850 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
2e860 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
2e870 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
2e880 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
2e890 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
2e8a0 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
2e8b0 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
2e8c0 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
2e8d0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
2e8e0 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
2e8f0 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
2e900 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
2e910 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
2e920 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
2e930 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2e940 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
2e950 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
2e960 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2e970 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
2e980 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
2e990 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
2e9a0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
2e9b0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2e9c0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
2e9d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
2e9e0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
2e9f0 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  ** occurs while 
2ea00 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61  locking the data
2ea10 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66  base, checking f
2ea20 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2ea30 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c   file or .** rol
2ea40 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
2ea50 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
2ea60 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2ea70 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
2ea80 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
2ea90 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
2eaa0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2eab0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2eac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2ead0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2eae0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
2eaf0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
2eb00 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20  from b-tree and 
2eb10 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20  only when there 
2eb20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73  are no.  ** outs
2eb30 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54  tanding pages. T
2eb40 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74  his implies that
2eb50 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65   the pager state
2eb60 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20   should either. 
2eb70 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52   ** be OPEN or R
2eb80 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73  EADER. READER is
2eb90 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
2eba0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
2ebb0 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65  r was in .  ** e
2ebc0 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
2ebd0 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mode..  */.  ass
2ebe0 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
2ebf0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
2ec00 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
2ec10 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
2ec20 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
2ec30 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
2ec40 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
2ec50 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
2ec60 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
2ec70 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
2ec80 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45  ;.  if( NEVER(ME
2ec90 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
2eca0 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72  rrCode) ){ retur
2ecb0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
2ecc0 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67  e; }..  if( !pag
2ecd0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2ece0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
2ecf0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
2ed00 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f  {.    int bHotJo
2ed10 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20  urnal = 1;      
2ed20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2ed30 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f  here exists a ho
2ed40 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a  t journal-file *
2ed50 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
2ed60 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
2ed70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52  ert( pPager->noR
2ed80 65 61 64 6c 6f 63 6b 3d 3d 30 20 7c 7c 20 70 50  eadlock==0 || pP
2ed90 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
2eda0 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ;..    if( pPage
2edb0 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30  r->noReadlock==0
2edc0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2edd0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
2ede0 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
2edf0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
2ee00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ee10 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2ee20 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
2ee30 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61  ==NO_LOCK || pPa
2ee40 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
2ee50 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
2ee60 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2ee70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2ee80 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
2ee90 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
2eea0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
2eeb0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
2eec0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
2eed0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
2eee0 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
2eef0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
2ef00 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
2ef10 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
2ef20 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41  ager->eLock<=SHA
2ef30 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
2ef40 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
2ef50 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48  rnal(pPager, &bH
2ef60 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  otJournal);.    
2ef70 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
2ef80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ef90 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2efa0 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74    }.    if( bHot
2efb0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
2efc0 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55   /* Get an EXCLU
2efd0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
2efe0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2eff0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
2f000 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   is.      ** imp
2f010 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
2f020 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
2f030 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
2f040 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
2f050 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
2f060 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
2f070 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
2f080 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
2f090 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
2f0a0 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
2f0b0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
2f0c0 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
2f0d0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
2f0e0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
2f0f0 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
2f100 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
2f110 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
2f120 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f  the .      ** ho
2f130 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a  t-journal back..
2f140 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
2f150 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
2f160 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
2f170 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
2f180 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a   requested, any.
2f190 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70        ** other p
2f1a0 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e  rocess attemptin
2f1b0 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  g to access the 
2f1c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
2f1d0 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20  ll get to .     
2f1e0 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69   ** this point i
2f1f0 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
2f200 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74  ail to obtain it
2f210 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
2f220 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f  lock .      ** o
2f230 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2f240 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ile..      **.  
2f250 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68      ** Unless th
2f260 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f  e pager is in lo
2f270 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
2f280 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c  sive mode, the l
2f290 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ock is.      ** 
2f2a0 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48  downgraded to SH
2f2b0 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65  ARED_LOCK before
2f2c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2f2d0 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f  eturns..      */
2f2e0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2f2f0 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
2f300 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
2f310 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2f320 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f330 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2f340 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
2f350 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74   /* If it is not
2f360 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e   already open an
2f370 64 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  d the file exist
2f380 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20  s on disk, open 
2f390 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  the .      ** jo
2f3a0 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
2f3b0 72 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69  rite access. Wri
2f3c0 74 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71  te access is req
2f3d0 75 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20  uired because . 
2f3e0 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75       ** in exclu
2f3f0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
2f400 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
2f410 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
2f420 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a  t open .      **
2f430 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73   and possibly us
2f440 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  ed for a transac
2f450 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41  tion later on. A
2f460 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73  lso, write-acces
2f470 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  s .      ** is u
2f480 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  sually required 
2f490 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
2f4a0 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e  journal in journ
2f4b0 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20  al_mode=persist 
2f4c0 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28  .      ** mode (
2f4d0 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75  and also for jou
2f4e0 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61  rnal_mode=trunca
2f4f0 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  te on some syste
2f500 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ms)..      **.  
2f510 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f      ** If the jo
2f520 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
2f530 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79  xist, it usually
2f540 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65   means that some
2f550 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72   .      ** other
2f560 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61   connection mana
2f570 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e  ged to get in an
2f580 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62  d roll it back b
2f590 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  efore .      ** 
2f5a0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
2f5b0 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63  obtained the exc
2f5c0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76  lusive lock abov
2f5d0 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20  e. Or, it .     
2f5e0 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61   ** may mean tha
2f5f0 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  t the pager was 
2f600 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
2f610 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20  te when this.   
2f620 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77     ** function w
2f630 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68  as called and th
2f640 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
2f650 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20  oes not exist.. 
2f660 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2f670 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
2f680 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
2f690 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
2f6a0 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
2f6b0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20  ger->pVfs;.     
2f6c0 20 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20     int bExists; 
2f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f6e0 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
2f6f0 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
2f700 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f710 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20  te3OsAccess(.   
2f720 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
2f730 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2f740 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
2f750 58 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29  XISTS, &bExists)
2f760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2f770 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
2f780 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
2f790 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
2f7a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
2f7b0 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
2f7c0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
2f7d0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2f7e0 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  AL;.          as
2f7f0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
2f800 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
2f810 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f820 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2f830 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2f840 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
2f850 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
2f860 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2f870 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
2f880 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2f890 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f8a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2f8b0 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
2f8c0 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
2f8d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2f8e0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2f8f0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2f900 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
2f910 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2f920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f930 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20    }.      }. .  
2f940 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
2f950 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
2f960 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
2f970 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
2f980 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
2f990 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
2f9a0 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67   read lock. Purg
2f9b0 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f  e the cache befo
2f9c0 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  re.      ** play
2f9d0 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74  ing back the hot
2f9e0 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74  -journal so that
2f9f0 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70   we don't end up
2fa00 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61   with.      ** a
2fa10 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
2fa20 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20  ache.  Sync the 
2fa30 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot journal befo
2fa40 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20  re playing.     
2fa50 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63   ** it back sinc
2fa60 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  e the process th
2fa70 61 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c  at crashed and l
2fa80 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  eft the hot jour
2fa90 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  nal.      ** pro
2faa0 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79  bably did not sy
2fab0 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65  nc it and we are
2fac0 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77   required to alw
2fad0 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a  ays sync.      *
2fae0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  * the journal be
2faf0 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20  fore playing it 
2fb00 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  back..      */. 
2fb10 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
2fb20 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2fb30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2fb40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2fb50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
2fb60 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
2fb70 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
2fb80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2fb90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2fba0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
2fbb0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
2fbc0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
2fbd0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
2fbe0 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20  ER_OPEN;.       
2fbf0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
2fc00 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
2fc10 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
2fc20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b       pagerUnlock
2fc30 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
2fc40 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
2fc50 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ..      if( rc!=
2fc60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fc70 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2fc80 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20  nch is taken if 
2fc90 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
2fca0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2fcb0 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
2fcc0 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68  or roll back a h
2fcd0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65  ot-journal while
2fce0 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
2fcf0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
2fd00 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72          ** pager
2fd10 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e  _unlock() routin
2fd20 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
2fd30 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2fd40 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20  g to unlock.    
2fd50 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e      ** the file.
2fd60 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61   If the unlock a
2fd70 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68  ttempt fails, th
2fd80 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d  en Pager.eLock m
2fd90 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
2fda0 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  * set to UNKNOWN
2fdb0 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63  _LOCK (see the c
2fdc0 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
2fdd0 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20   #define for .  
2fde0 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e        ** UNKNOWN
2fdf0 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20  _LOCK above for 
2fe00 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e  an explanation).
2fe10 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
2fe20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72       ** In order
2fe30 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e   to get pager_un
2fe40 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69  lock() to do thi
2fe50 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74  s, set Pager.eSt
2fe60 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ate to.        *
2fe70 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f  * PAGER_ERROR no
2fe80 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  w. This is not a
2fe90 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20  ctually counted 
2fea0 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a  as a transition.
2feb0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52          ** to ER
2fec0 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65  ROR state in the
2fed0 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61   state diagram a
2fee0 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69  t the top of thi
2fef0 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20  s file,.        
2ff00 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77  ** since we know
2ff10 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
2ff20 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
2ff30 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a  ock() will very.
2ff40 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74          ** short
2ff50 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68  ly transition th
2ff60 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74  e pager object t
2ff70 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  o the OPEN state
2ff80 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20  . Calling.      
2ff90 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65    ** assert_page
2ffa0 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20  r_state() would 
2ffb0 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20  fail now, as it 
2ffc0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f  should not be po
2ffd0 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a  ssible.        *
2ffe0 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52  * to be in ERROR
2fff0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72   state when ther
30000 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74  e are zero outst
30010 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20  anding page .   
30020 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63       ** referenc
30030 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
30040 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72         pager_err
30050 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
30060 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
30070 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
30080 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
30090 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
300a0 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20  R_OPEN );.      
300b0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
300c0 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
300d0 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20  OCK).           
300e0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c  || (pPager->excl
300f0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
30100 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45  ger->eLock>SHARE
30110 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b  D_LOCK).      );
30120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
30130 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
30140 65 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67  e .     && (pPag
30150 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73  er->pBackup || s
30160 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
30170 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
30180 43 61 63 68 65 29 3e 30 29 20 0a 20 20 20 20 29  Cache)>0) .    )
30190 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73  {.      /* The s
301a0 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
301b0 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
301c0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
301d0 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
301e0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
301f0 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
30200 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
30210 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
30220 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
30230 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
30240 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
30250 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
30260 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d     ** has been m
30270 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
30280 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
30290 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65  anged, flush the
302a0 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  .      ** cache.
302b0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
302c0 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
302d0 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
302e0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
302f0 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
30300 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
30310 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
30320 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
30330 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
30340 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
30350 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
30360 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
30370 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
30380 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
30390 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
303a0 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
303b0 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
303c0 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
303d0 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
303e0 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
303f0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
30400 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
30410 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
30420 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
30430 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
30440 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
30450 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
30460 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
30470 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
30480 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
30490 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
304a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
304b0 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b   Pgno nPage = 0;
304c0 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
304d0 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
304e0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
304f0 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  )];..      rc = 
30500 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
30510 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
30520 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
30530 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20  oto failed;..   
30540 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29     if( nPage>0 )
30550 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
30560 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
30570 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
30580 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
30590 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
305a0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
305b0 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
305c0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
305d0 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
305e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
305f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30600 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
30610 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
30620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30630 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
30640 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
30650 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
30660 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
30670 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
30680 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
30690 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
306a0 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
306b0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
306c0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
306d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
306e0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
306f0 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74   a WAL file in t
30700 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
30710 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61  open this databa
30720 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a  se in WAL.    **
30730 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   mode. Otherwise
30740 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
30750 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73  function call is
30760 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f   a no-op..    */
30770 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
30780 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
30790 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66  pPager);.#ifndef
307a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
307b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
307c0 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20  ger->pWal==0 || 
307d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
307e0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
307f0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
30800 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
30810 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
30820 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
30830 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
30840 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
30850 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  );.  }..  if( pP
30860 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
30870 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d  GER_OPEN && rc==
30880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30890 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
308a0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50  ount(pPager, &pP
308b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
308c0 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69   }.. failed:.  i
308d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
308e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
308f0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
30900 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
30910 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
30920 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
30930 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
30940 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
30950 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
30960 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20  R_READER;.  }.  
30970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30980 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72  .** If the refer
30990 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72  ence count has r
309a0 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c  eached zero, rol
309b0 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
309c0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
309d0 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  and unlock the p
309e0 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ager..**.** Exce
309f0 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  pt, in locking_m
30a00 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68  ode=EXCLUSIVE wh
30a10 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  en there is noth
30a20 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65  ing to in.** the
30a30 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
30a40 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73  l, the unlock is
30a50 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61   not performed a
30a60 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  nd there is.** n
30a70 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  othing to rollba
30a80 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ck, so this rout
30a90 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
30aa0 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
30ab0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
30ac0 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
30ad0 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74  r){.  if( (sqlit
30ae0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
30af0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
30b00 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67  )==0) ){.    pag
30b10 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
30b20 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
30b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
30b40 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
30b50 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
30b60 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65  o in pager pPage
30b70 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66  r (a page.** ref
30b80 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20  erence has type 
30b90 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65  DbPage*). If the
30ba0 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72   requested refer
30bb0 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63  ence is .** succ
30bc0 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
30bd0 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  d, it is copied 
30be0 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53  to *ppPage and S
30bf0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
30c00 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
30c10 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
30c20 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
30c30 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65   cache, it is re
30c40 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
30c50 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67  rwise, a new pag
30c60 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  e object is allo
30c70 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
30c80 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a  ted with data.**
30c90 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
30ca0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e  atabase file. In
30cb0 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
30cc0 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d   pcache module m
30cd0 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74  ay.** choose not
30ce0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
30cf0 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61  ew page object a
30d00 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20  nd may reuse an 
30d10 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65  existing.** obje
30d20 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74  ct with no outst
30d30 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
30d40 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74  s..**.** The ext
30d50 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
30d60 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
30d70 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
30d80 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a   to zeros the .*
30d90 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  * first time a p
30da0 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
30db0 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68  to memory. If th
30dc0 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64  e page requested
30dd0 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20   is .** already 
30de0 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65  in the cache whe
30df0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
30e00 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
30e10 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74  the extra.** dat
30e20 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20  a is left as it 
30e30 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  was when the pag
30e40 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73  e object was las
30e50 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  t used..**.** If
30e60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
30e70 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  age is smaller t
30e80 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
30e90 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a  d page or if a .
30ea0 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
30eb0 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  e is passed as t
30ec0 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72  he noContent par
30ed0 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a  ameter and the .
30ee0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
30ef0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
30f00 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
30f10 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
30f20 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
30f30 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
30f40 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
30f50 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
30f60 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
30f70 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
30f80 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
30f90 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
30fa0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
30fb0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
30fc0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
30fd0 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
30fe0 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
30ff0 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73  n two seperate s
31000 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
31010 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e    a) When readin
31020 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  g a free-list le
31030 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  af page from the
31040 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a   database, and.*
31050 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61  *.**   b) When a
31060 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65   savepoint is be
31070 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
31080 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c  and we need to l
31090 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65  oad.**      a ne
310a0 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
310b0 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c  cache to be fill
310c0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
310d0 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
310e0 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  om the savepoint
310f0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
31100 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
31110 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
31120 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
31130 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f  zeroed instead o
31140 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  f.** being read 
31150 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
31160 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
31170 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
31180 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
31190 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
311a0 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
311b0 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
311c0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
311d0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
311e0 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
311f0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
31200 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
31210 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
31220 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
31230 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
31240 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
31250 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
31260 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
31270 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
31280 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
31290 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
312a0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
312b0 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
312c0 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
312d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
312e0 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
312f0 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
31300 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
31310 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
31320 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
31330 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
31340 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
31350 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
31360 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
31370 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
31380 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
31390 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
313a0 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
313b0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
313c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
313d0 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
313e0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
313f0 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
31400 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
31410 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
31420 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
31430 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
31440 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
31450 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
31460 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
31470 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
31480 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
31490 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
314a0 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
314b0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
314c0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
314d0 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
314e0 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
314f0 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
31500 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
31510 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
31520 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
31530 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
31540 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
31550 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
31560 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
31570 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31580 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
31590 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
315a0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
315b0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
315c0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
315d0 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
315e0 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
315f0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
31600 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
31610 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
31620 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
31630 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
31640 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
31650 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
31660 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
31670 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
31680 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
31690 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
316a0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
316b0 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
316c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
316d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
316e0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
316f0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
31700 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74  error state, ret
31710 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d  urn an error imm
31720 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20  ediately. .  ** 
31730 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65  Otherwise, reque
31740 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  st the page from
31750 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65   the PCache laye
31760 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  r. */.  if( pPag
31770 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
31780 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
31790 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
317a0 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
317b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
317c0 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
317d0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
317e0 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a  1, ppPage);.  }.
317f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
31800 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  E_OK ){.    /* E
31810 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74  ither the call t
31820 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  o sqlite3PcacheF
31830 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20  etch() returned 
31840 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a  an error or the.
31850 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73      ** pager was
31860 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
31870 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
31880 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
31890 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
318a0 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61  * Set pPg to 0 a
318b0 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65  nd jump to the e
318c0 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72  xception handler
318d0 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  .  */.    pPg = 
318e0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  0;.    goto page
318f0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
31900 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70   }.  assert( (*p
31910 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67  pPage)->pgno==pg
31920 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
31930 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
31940 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70  r==pPager || (*p
31950 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
31960 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70  0 );..  if( (*pp
31970 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26  Page)->pPager &&
31980 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
31990 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
319a0 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
319b0 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
319c0 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
319d0 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
319e0 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
319f0 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
31a00 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  o.  */.    asser
31a10 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d  t( pgno<=PAGER_M
31a20 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21  AX_PGNO && pgno!
31a30 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
31a40 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50  Pager) );.    pP
31a50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20  ager->nHit++;.  
31a60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31a70 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OK;..  }else{.  
31a80 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
31a90 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64  ache has created
31aa0 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73   a new page. Its
31ab0 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74   content needs t
31ac0 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69  o .    ** be ini
31ad0 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20  tialized.  */.. 
31ae0 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
31af0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
31b00 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
31b10 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
31b20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
31b30 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
31b40 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
31b50 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  page.    ** numb
31b60 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
31b70 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75  this, or the unu
31b80 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65  sed locking-page
31b90 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20  , is requested. 
31ba0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
31bb0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
31bc0 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
31bd0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
31be0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
31bf0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
31c00 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
31c10 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
31c20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45     }..    if( ME
31c30 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  MDB || pPager->d
31c40 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f  bSize<pgno || no
31c50 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70  Content || !isOp
31c60 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
31c70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
31c80 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
31c90 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
31ca0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
31cb0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
31cc0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
31cd0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
31ce0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
31cf0 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
31d00 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
31d10 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
31d20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
31d30 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a  enign..        *
31d40 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e  * It merely mean
31d50 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20  s that we might 
31d60 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f  do some extra wo
31d70 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20  rk to journal a 
31d80 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
31d90 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
31da0 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
31db0 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  led.  Neverthele
31dc0 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20  ss, be sure .   
31dd0 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20       ** to test 
31de0 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61  the case where a
31df0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
31e00 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
31e10 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20  g to set .      
31e20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20    ** a bit in a 
31e30 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20  bit vector..    
31e40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
31e50 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
31e60 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
31e70 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
31e80 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
31e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53  ){.          TES
31ea0 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71  TONLY( rc = ) sq
31eb0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
31ec0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
31ed0 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  l, pgno);.      
31ee0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
31ef0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
31f00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31f10 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
31f20 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f   = ) addToSavepo
31f30 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
31f40 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
31f50 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
31f60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
31f70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
31f80 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
31f90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31fa0 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
31fb0 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
31fc0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49  geSize);.      I
31fd0 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
31fe0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
31ff0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
32000 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
32010 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
32020 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50  ager );.      pP
32030 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20  ager->nMiss++;. 
32040 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
32050 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
32060 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32070 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
32080 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
32090 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
320a0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
320b0 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
320c0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
320d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
320e0 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
320f0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
32100 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
32110 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
32120 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
32130 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
32140 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
32150 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20  er);..  *ppPage 
32160 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
32170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
32180 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
32190 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
321a0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
321b0 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
321c0 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
321d0 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
321e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
321f0 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
32200 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
32210 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a   in cache. .**.*
32220 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
32230 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54  e3PagerGet().  T
32240 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
32250 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
32260 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
32270 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74  3PagerGet() is t
32280 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
32290 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
322a0 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
322b0 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
322c0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
322d0 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
322e0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
322f0 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
32300 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
32310 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
32320 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
32330 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
32340 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73  ed..*/.DbPage *s
32350 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
32360 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
32370 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
32380 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
32390 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
323a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
323b0 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
323c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
323d0 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  ache!=0 );.  ass
323e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
323f0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
32400 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
32410 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
32420 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   );.  sqlite3Pca
32430 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
32440 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
32450 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75  0, &pPg);.  retu
32460 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
32470 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20   Release a page 
32480 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a  reference..**.**
32490 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
324a0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
324b0 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
324c0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
324d0 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
324e0 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
324f0 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
32500 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
32510 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
32520 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
32530 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
32540 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
32550 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
32560 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
32570 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
32580 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
32590 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65   pPg ){.    Page
325a0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
325b0 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c  >pPager;.    sql
325c0 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
325d0 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65  e(pPg);.    page
325e0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
325f0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
32600 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
32610 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
32620 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
32630 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
32640 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
32650 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
32660 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
32670 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
32680 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
32690 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
326a0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
326b0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
326c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
326d0 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
326e0 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
326f0 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
32700 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
32710 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
32720 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
32730 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
32740 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
32750 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
32760 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
32770 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
32780 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
32790 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
327a0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
327b0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
327c0 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
327d0 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
327e0 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
327f0 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
32800 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
32810 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
32820 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
32830 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
32840 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
32850 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
32860 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
32870 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
32880 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
32890 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
328a0 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
328b0 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
328c0 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
328d0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
328e0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
328f0 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
32900 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
32910 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
32920 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
32930 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
32940 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
32950 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
32960 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
32970 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
32980 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
32990 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
329a0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
329b0 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
329c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
329d0 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
329e0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
329f0 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
32a00 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
32a10 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
32a20 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
32a30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
32a60 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
32a70 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
32a80 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
32a90 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  Vfs;   /* Local 
32aa0 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69  cache of vfs poi
32ab0 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
32ac0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
32ad0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
32ae0 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65  LOCKED );.  asse
32af0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
32b00 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
32b10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
32b20 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
32b30 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
32b40 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
32b50 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73  rror state, this
32b60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
32b70 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20  o-op.  But on.  
32b80 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  ** the other han
32b90 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
32ba0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
32bb0 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  if we are alread
32bc0 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  y in.  ** an err
32bd0 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
32be0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
32bf0 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
32c00 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
32c10 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65  de;..  if( !page
32c20 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
32c30 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
32c40 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
32c50 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
32c60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
32c70 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
32c80 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
32c90 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
32ca0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
32cb0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
32cc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
32cd0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
32ce0 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  .  .    /* Open 
32cf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
32d00 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
32d10 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20  ready open. */. 
32d20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
32d30 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
32d40 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
32d50 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
32d60 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
32d70 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
32d80 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
32d90 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
32da0 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  jfd);.      }els
32db0 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  e{.        const
32dc0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20   int flags =    
32dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32de0 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f  * VFS flags to o
32df0 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
32e00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53 51   */.          SQ
32e10 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
32e20 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
32e30 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
32e40 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46    (pPager->tempF
32e50 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20  ile ? .         
32e60 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
32e70 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51  DELETEONCLOSE|SQ
32e80 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
32e90 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20  OURNAL):.       
32ea0 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
32eb0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a  N_MAIN_JOURNAL).
32ec0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23            );.  #
32ed0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
32ee0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
32ef0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
32f00 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e  lite3JournalOpen
32f10 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  (.            pV
32f20 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
32f30 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
32f40 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75  d, flags, jrnlBu
32f50 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
32f60 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 65  .        );.  #e
32f70 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63 20 3d  lse.        rc =
32f80 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
32f90 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
32fa0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
32fb0 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  fd, flags, 0);. 
32fc0 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a   #endif.      }.
32fd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
32fe0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
32ff0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
33000 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  d) );.    }.  . 
33010 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
33020 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
33030 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a   header to the j
33040 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
33050 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  open .    ** the
33060 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
33070 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
33080 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
33090 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
330a0 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
330b0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
330c0 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
330d0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50  red. */.      pP
330e0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
330f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
33100 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
33110 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
33120 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
33130 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
33140 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Hdr = 0;.      r
33150 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
33160 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
33170 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
33180 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33190 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
331a0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
331b0 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
331c0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
331d0 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nal = 0;.  }else
331e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
331f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
33200 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
33210 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  D );.    pPager-
33220 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
33230 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b  WRITER_CACHEMOD;
33240 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
33250 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
33260 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
33270 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
33280 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
33290 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
332a0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
332b0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
332c0 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
332d0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
332e0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
332f0 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
33300 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
33310 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
33320 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
33330 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
33340 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
33350 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
33360 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
33370 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
33380 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
33390 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
333a0 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
333b0 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
333c0 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
333d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
333e0 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
333f0 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
33400 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
33410 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
33420 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
33430 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
33440 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
33450 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
33460 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
33470 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
33480 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
33490 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
334a0 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
334b0 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
334c0 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
334d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
334e0 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
334f0 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
33500 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
33510 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
33520 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
33530 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
33540 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
33550 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
33560 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
33570 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
33580 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
33590 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
335a0 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
335b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
335c0 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
335d0 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
335e0 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
335f0 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
33600 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
33610 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
33620 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  de ) return pPag
33630 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
33640 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
33650 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
33660 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  DER && pPager->e
33670 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f  State<PAGER_ERRO
33680 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  R );.  pPager->s
33690 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
336a0 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
336b0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
336c0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
336d0 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20  GER_READER) ){. 
336e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
336f0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
33700 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67   );..    if( pag
33710 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
33720 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
33730 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e  the pager is con
33740 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c  figured to use l
33750 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
33760 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20  usive, and an.  
33770 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
33780 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
33790 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72  abase is not alr
337a0 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69  eady held, obtai
337b0 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20  n it now..      
337c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
337d0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
337e0 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c  de && sqlite3Wal
337f0 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
33800 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20  ager->pWal, -1) 
33810 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
33820 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
33830 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
33840 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
33850 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33860 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
33870 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
33880 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33890 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
338a0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
338b0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
338c0 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72    /* Grab the wr
338d0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
338e0 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63  log file. If suc
338f0 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65  cessful, upgrade
33900 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47   to.      ** PAG
33910 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
33920 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
33930 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
33940 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
33950 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62  ..      ** The b
33960 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e  usy-handler is n
33970 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e  ot invoked if an
33980 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
33990 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a   already.      *
339a0 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74  * holds the writ
339b0 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69  e-lock. If possi
339c0 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ble, the upper l
339d0 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69  ayer will call i
339e0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
339f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
33a00 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73  lBeginWriteTrans
33a10 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
33a20 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Wal);.    }else{
33a30 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  .      /* Obtain
33a40 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
33a50 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
33a60 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78   file. If the ex
33a70 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20  Flag parameter. 
33a80 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c       ** is true,
33a90 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c   then immediatel
33aa0 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74  y upgrade this t
33ab0 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
33ac0 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  ock. The.      *
33ad0 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  * busy-handler c
33ae0 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75  allback can be u
33af0 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69  sed when upgradi
33b00 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53  ng to the EXCLUS
33b10 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  IVE.      ** loc
33b20 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20  k, but not when 
33b30 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45  obtaining the RE
33b40 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20  SERVED lock..   
33b50 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
33b60 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
33b70 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ger, RESERVED_LO
33b80 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
33b90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33ba0 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
33bb0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
33bc0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
33bd0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
33be0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
33bf0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
33c00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33c10 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52   /* Change to WR
33c20 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
33c30 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
33c40 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65    ** WAL mode se
33c50 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  ts Pager.eState 
33c60 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  to PAGER_WRITER_
33c70 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d  LOCKED or CACHEM
33c80 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  OD.      ** when
33c90 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20   it has an open 
33ca0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
33cb0 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20   never to DBMOD 
33cc0 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20  or FINISHED..   
33cd0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65     ** This is be
33ce0 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73  cause in those s
33cf0 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  tates the code t
33d00 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65  o roll back save
33d10 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
33d20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79  transactions may
33d30 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   copy data from 
33d40 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
33d50 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
33d60 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
33d70 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f   as well as into
33d80 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
33d90 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20   Which would be 
33da0 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20  incorrect in .  
33db0 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e      ** WAL mode.
33dc0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33dd0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
33de0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
33df0 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67  CKED;.      pPag
33e00 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
33e10 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
33e20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
33e30 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  bFileSize = pPag
33e40 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
33e50 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
33e60 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
33e70 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
33e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
33e90 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
33ea0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
33eb0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
33ec0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
33ed0 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73  EADER );.    ass
33ee0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
33ef0 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
33f00 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
33f10 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  ER_LOCKED );.   
33f20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
33f30 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
33f40 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41  er) );.  }..  PA
33f50 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53  GERTRACE(("TRANS
33f60 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
33f70 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
33f80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33f90 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69  ./*.** Mark a si
33fa0 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61  ngle data page a
33fb0 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65  s writeable. The
33fc0 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
33fd0 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61   into the .** ma
33fe0 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75  in journal or su
33ff0 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71  b-journal as req
34000 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61  uired. If the pa
34010 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
34020 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  to.** one of the
34030 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63   journals, the c
34040 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
34050 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a   is set in the .
34060 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
34070 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74  nal bitvec and t
34080 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
34090 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
340a0 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79  itvecs.** of any
340b0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
340c0 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
340d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
340e0 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72  ager_write(PgHdr
340f0 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a   *pPg){.  void *
34100 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
34110 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ta;.  Pager *pPa
34120 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
34130 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
34140 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54  LITE_OK;..  /* T
34150 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
34160 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73  ot called unless
34170 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
34180 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
34190 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72   .  ** been star
341a0 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ted. The journal
341b0 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79   file may or may
341c0 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20   not be open at 
341d0 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
341e0 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c   It is never cal
341f0 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52  led in the ERROR
34200 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61   state..  */.  a
34210 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
34220 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
34230 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20  TER_LOCKED.     
34240 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
34250 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
34260 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
34270 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
34280 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
34290 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
342a0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
342b0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
342c0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  ) );..  /* If an
342d0 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
342e0 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63  previously detec
342f0 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20  ted, report the 
34300 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20  same error.  ** 
34310 61 67 61 69 6e 2e 20 54 68 69 73 20 73 68 6f 75  again. This shou
34320 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20 62  ld not happen, b
34330 75 74 20 74 68 65 20 63 68 65 63 6b 20 70 72 6f  ut the check pro
34340 76 69 64 65 73 20 72 6f 62 75 73 74 6e 65 73 73  vides robustness
34350 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
34360 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
34370 29 20 29 20 20 72 65 74 75 72 6e 20 70 50 61 67  ) )  return pPag
34380 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
34390 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20  /* Higher-level 
343a0 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63  routines never c
343b0 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
343c0 6e 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73  n if database is
343d0 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62   not.  ** writab
343e0 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61  le.  But check a
343f0 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20  nyway, just for 
34400 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20  robustness. */. 
34410 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
34420 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72  r->readOnly) ) r
34430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
34440 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  M;..  CHECK_PAGE
34450 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  (pPg);..  /* The
34460 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
34470 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  eds to be opened
34480 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72  . Higher level r
34490 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72  outines have alr
344a0 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  eady.  ** obtain
344b0 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ed the necessary
344c0 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20   locks to begin 
344d0 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
344e0 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20  ction, but the. 
344f0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
34500 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79  rnal might not y
34510 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e  et be open. Open
34520 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20   it now if this 
34530 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a  is the case..  *
34540 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64  *.  ** This is d
34550 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  one before calli
34560 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
34570 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74  MakeDirty() on t
34580 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f  he page. .  ** O
34590 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74 20  therwise, if it 
345a0 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20  were done after 
345b0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50  calling sqlite3P
345c0 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29  cacheMakeDirty()
345d0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65  , then.  ** an e
345e0 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72  rror might occur
345f0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 77   and the pager w
34600 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57  ould end up in W
34610 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
34620 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67  te.  ** with pag
34630 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  es marked as dir
34640 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ty in the cache.
34650 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
34660 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
34670 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
34680 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
34690 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
346a0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
346b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
346c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
346d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
346e0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
346f0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
34700 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
34710 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
34720 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20  Pager) );..  /* 
34730 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
34740 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
34750 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
34760 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
34770 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
34780 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
34790 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
347a0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
347b0 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
347c0 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49  Pg);.  if( pageI
347d0 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
347e0 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
347f0 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 61  ge(pPg) ){.    a
34800 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
34810 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
34820 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f   }else{.  .    /
34830 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
34840 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
34850 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
34860 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
34870 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
34880 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
34890 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
348a0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
348b0 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
348c0 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
348d0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
348e0 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
348f0 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
34900 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a      if( !pageInJ
34910 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21  ournal(pPg) && !
34920 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
34930 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  er) ){.      ass
34940 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
34950 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
34960 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67       if( pPg->pg
34970 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
34980 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65 6e  igSize && isOpen
34990 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
349a0 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73  .        u32 cks
349b0 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  um;.        char
349c0 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20 20   *pData2;.      
349d0 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61    i64 iOff = pPa
349e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
349f0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  ..        /* We 
34a00 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69  should never wri
34a10 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
34a20 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20  l file the page 
34a30 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
34a40 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
34a50 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
34a60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
34a70 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20  rt verifies.    
34a80 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
34a90 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
34aa0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
34ab0 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
34ac0 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  NO(pPager) );.. 
34ad0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
34ae0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
34af0 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r<=pPager->journ
34b00 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20  alOff );.       
34b10 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
34b20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
34b30 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
34b40 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
34b50 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
34b60 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
34b70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
34b80 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  a2);..        /*
34b90 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f   Even if an IO o
34ba0 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72  r diskfull error
34bb0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f   occurs while jo
34bc0 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20  urnalling the.  
34bd0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
34be0 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
34bf0 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73  , set the need-s
34c00 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65  ync flag for the
34c10 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
34c20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65  * Otherwise, whe
34c30 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
34c40 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
34c50 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20  , the logic in. 
34c60 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61         ** playba
34c70 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69  ck_one_page() wi
34c80 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68  ll think that th
34c90 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
34ca0 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20  be restored.    
34cb0 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61      ** in the da
34cc0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64  tabase file. And
34cd0 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
34ce0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69  occurs while doi
34cf0 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a  ng so,.        *
34d00 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f  * then corruptio
34d10 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20  n may follow..  
34d20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34d30 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
34d40 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
34d50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
34d60 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
34d70 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67  ->jfd, iOff, pPg
34d80 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
34d90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34da0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
34db0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
34dc0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
34dd0 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
34de0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
34df0 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20  e, iOff+4);.    
34e00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34e10 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
34e20 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  c;.        rc = 
34e30 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
34e40 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50  er->jfd, iOff+pP
34e50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
34e60 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20  , cksum);.      
34e70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34e80 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
34e90 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ..        IOTRAC
34ea0 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
34eb0 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
34ec0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
34ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ee0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
34ef0 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
34f00 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
34f10 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
34f20 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
34f30 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
34f40 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55  PAGERTRACE(("JOU
34f50 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
34f60 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
34f70 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
34f80 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
34f90 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
34fa0 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
34fb0 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
34fc0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
34fd0 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65  1:0), pager_page
34fe0 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
34ff0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
35000 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20  urnalOff += 8 + 
35010 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
35020 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
35030 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
35040 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35050 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
35060 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
35070 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
35080 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
35090 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
350a0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
350b0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
350c0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61  MEM );.        a
350d0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
350e0 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
350f0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
35100 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53      rc |= addToS
35110 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
35120 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
35130 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
35140 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35150 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
35160 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  t( rc==SQLITE_NO
35170 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  MEM );.         
35180 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
35190 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
351a0 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e{.        if( p
351b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
351c0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
351d0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  D ){.          p
351e0 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
351f0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
35200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35210 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50  PAGERTRACE(("APP
35220 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
35230 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
35240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
35250 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
35260 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  pPg->pgno,.     
35270 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
35280 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
35290 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a  D_SYNC)?1:0)));.
352a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
352b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
352c0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
352d0 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
352e0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
352f0 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
35300 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
35310 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
35320 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
35330 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
35340 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
35350 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
35360 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
35370 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
35380 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
35390 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
353a0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
353b0 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
353c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75     */.    if( su
353d0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
353e0 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Pg) ){.      rc 
353f0 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
35400 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
35410 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
35420 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
35430 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
35440 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
35450 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20  bSize<pPg->pgno 
35460 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
35470 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
35480 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  o;.  }.  return 
35490 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
354a0 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
354b0 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73   writeable. This
354c0 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
354d0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a   called before .
354e0 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ** making change
354f0 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65  s to a page. The
35500 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65   caller must che
35510 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ck the return va
35520 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20  lue .** of this 
35530 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20  function and be 
35540 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63  careful not to c
35550 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
35560 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74  ata unless .** t
35570 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
35580 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
35590 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
355a0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
355b0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61   function and pa
355c0 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74  ger_write() is t
355d0 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hat this.** func
355e0 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20  tion also deals 
355f0 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
35600 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72   case where 2 or
35610 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66   more pages.** f
35620 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64  it on a single d
35630 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74  isk sector. In t
35640 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d  his case all co-
35650 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a  resident pages.*
35660 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  * must have been
35670 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
35680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
35690 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
356a0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
356b0 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
356c0 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65  NOMEM or an IO e
356d0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
356e0 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72  urned.** as appr
356f0 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69  opriate. Otherwi
35700 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
35710 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
35720 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  erWrite(DbPage *
35730 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  pDbPage){.  int 
35740 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
35750 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
35760 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
35770 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
35780 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e  pPager;.  Pgno n
35790 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20  PagePerSector = 
357a0 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
357b0 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  ize/pPager->page
357c0 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72 74  Size);..  assert
357d0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
357e0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
357f0 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
35800 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
35810 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
35820 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
35830 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
35840 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
35850 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e   nPagePerSector>
35860 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  1 ){.    Pgno nP
35870 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  ageCount;       
35880 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
35890 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
358a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
358b0 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20      Pgno pg1;   
358c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
358d0 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
358e0 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
358f0 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a   located on. */.
35900 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
35910 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
35920 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
35930 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
35940 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
35950 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
35960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35970 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
35980 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
35990 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
359a0 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67   True if any pag
359b0 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44  e has PGHDR_NEED
359c0 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a  _SYNC */..    /*
359d0 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
359e0 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20  ncSpill flag to 
359f0 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
35a00 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  se we cannot all
35a10 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72  ow.    ** a jour
35a20 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65  nal header to be
35a30 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e   written between
35a40 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e   the pages journ
35a50 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74  aled by.    ** t
35a60 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
35a70 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
35a80 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
35a90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
35aa0 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30  oNotSyncSpill==0
35ab0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
35ac0 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b  doNotSyncSpill++
35ad0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
35ae0 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
35af0 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
35b00 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
35b10 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
35b20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
35b30 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
35b40 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
35b50 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
35b60 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
35b70 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
35b80 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
35b90 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
35ba0 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
35bb0 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
35bc0 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
35bd0 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f   1;..    nPageCo
35be0 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  unt = pPager->db
35bf0 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 50  Size;.    if( pP
35c00 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
35c10 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
35c20 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
35c30 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
35c40 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
35c50 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
35c60 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
35c70 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
35c80 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
35c90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
35ca0 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
35cb0 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
35cc0 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
35cd0 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
35ce0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
35cf0 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
35d00 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
35d10 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
35d20 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
35d30 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
35d40 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
35d50 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
35d60 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
35d70 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
35d80 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
35d90 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
35da0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
35db0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
35dc0 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
35dd0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
35de0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
35df0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
35e00 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
35e10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
35e20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
35e40 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
35e50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
35e60 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
35e70 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
35e80 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
35e90 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
35ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
35eb0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
35ec0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
35ed0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
35ee0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
35ef0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61    }else if( (pPa
35f00 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
35f10 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d  p(pPager, pg))!=
35f20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
35f30 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
35f40 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
35f50 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
35f60 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
35f70 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
35f80 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
35f90 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
35fa0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
35fb0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
35fc0 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  C flag is set fo
35fd0 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61  r any of the nPa
35fe0 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
35ff0 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
36000 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20  , then it needs 
36010 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c  to be set for al
36020 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75  l of them. Becau
36030 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e  se.    ** writin
36040 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73  g to any of thes
36050 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61  e nPage pages ma
36060 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68  y damage the oth
36070 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ers, the.    ** 
36080 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
36090 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29  t contain sync()
360a0 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c  ed copies of all
360b0 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
360c0 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68  before any of th
360d0 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  em can be writte
360e0 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
360f0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
36100 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
36110 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64  QLITE_OK && need
36120 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
36130 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
36140 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
36150 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b  ii<nPage; ii++){
36160 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
36170 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
36180 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31  okup(pPager, pg1
36190 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii);.        if
361a0 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ( pPage ){.     
361b0 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67       pPage->flag
361c0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
361d0 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
361e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
361f0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
36200 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
36210 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
36220 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
36230 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20  Spill==1 );.    
36240 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
36250 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73  cSpill--;.  }els
36260 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
36270 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
36280 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
36290 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
362a0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
362b0 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
362c0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
362d0 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
362e0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
362f0 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
36300 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
36310 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
36320 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
36330 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
36340 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
36350 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
36360 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
36370 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
36380 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
36390 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
363a0 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a  DIRTY;.}.#endif.
363b0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
363c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
363d0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
363e0 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
363f0 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
36400 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
36410 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
36420 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
36430 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
36440 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
36450 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
36460 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  ty.  This happen
36470 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
36480 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  when.** the page
36490 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20   has been added 
364a0 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  as a leaf of the
364b0 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f   freelist and so
364c0 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   its.** content 
364d0 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72  no longer matter
364e0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  s..**.** The ove
364f0 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
36500 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
36510 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
36520 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
36530 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
36540 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68  ge is unused. Th
36550 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
36560 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
36570 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
36580 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
36590 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
365a0 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
365b0 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
365c0 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c  ion can quadrupl
365d0 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
365e0 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20  arge .** DELETE 
365f0 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76  operations..*/.v
36600 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
36610 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20  DontWrite(PgHdr 
36620 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
36630 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
36640 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67  ager;.  if( (pPg
36650 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
36660 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e  RTY) && pPager->
36670 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b  nSavepoint==0 ){
36680 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
36690 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
366a0 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
366b0 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
366c0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
366d0 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
366e0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
366f0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
36700 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
36710 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
36720 45 3b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74  E;.    pager_set
36730 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
36740 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
36750 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
36760 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
36770 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
36780 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
36790 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  .** change-count
367a0 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
367b0 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
367c0 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69  n integer starti
367d0 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f  ng at .** byte o
367e0 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20  ffset 24 of the 
367f0 70 61 67 65 72 20 66 69 6c 65 2e 20 20 54 68 65  pager file.  The
36800 20 73 65 63 6f 6e 64 61 72 79 20 63 68 61 6e 67   secondary chang
36810 65 20 63 6f 75 6e 74 65 72 20 61 74 0a 2a 2a 20  e counter at.** 
36820 39 32 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74  92 is also updat
36830 65 64 2c 20 61 73 20 69 73 20 74 68 65 20 53 51  ed, as is the SQ
36840 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  Lite version num
36850 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36  ber at offset 96
36860 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 69 73  ..**.** But this
36870 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
36880 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61   the pPager->cha
36890 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
368a0 67 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 54  g is false..** T
368b0 6f 20 61 76 6f 69 64 20 65 78 63 65 73 73 20 63  o avoid excess c
368c0 68 75 72 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  hurning of page 
368d0 31 2c 20 74 68 65 20 75 70 64 61 74 65 20 6f 6e  1, the update on
368e0 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2e  ly happens once.
368f0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
36900 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
36910 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 72 6f 75  ngecounter() rou
36920 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 61  tine that does a
36930 6e 20 0a 2a 2a 20 75 6e 63 6f 6e 64 69 74 69 6f  n .** unconditio
36940 6e 61 6c 20 75 70 64 61 74 65 20 6f 66 20 74 68  nal update of th
36950 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
36960 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
36970 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61  isDirectMode fla
36980 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  g is zero, then 
36990 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20  this is done by 
369a0 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69  calling .** sqli
369b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
369c0 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  on page 1, then 
369d0 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
369e0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
369f0 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74   page data. In t
36a00 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c  his case the fil
36a10 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65  e will be update
36a20 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  d when the curre
36a30 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
36a40 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
36a50 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65  **.** The isDire
36a60 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20  ctMode flag may 
36a70 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f  only be non-zero
36a80 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79 20   if the library 
36a90 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20  was compiled.** 
36aa0 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
36ab0 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
36ac0 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ITE macro define
36ad0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  d. In this case,
36ae0 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74 20  .** if isDirect 
36af0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
36b00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
36b10 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 64  ile is updated d
36b20 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72  irectly.** by wr
36b30 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64  iting an updated
36b40 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
36b50 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20   1 using a call 
36b60 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  to the .** sqlit
36b70 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63  e3OsWrite() func
36b80 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
36b90 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
36ba0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
36bb0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
36bc0 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20  isDirectMode){. 
36bd0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36be0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
36bf0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36c00 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
36c10 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
36c20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36c30 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
36c40 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OD.  );.  assert
36c50 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
36c60 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
36c70 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e  .  /* Declare an
36c80 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e  d initialize con
36c90 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69  stant integer 'i
36ca0 73 44 69 72 65 63 74 27 2e 20 49 66 20 74 68 65  sDirect'. If the
36cb0 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69  .  ** atomic-wri
36cc0 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
36cd0 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68  is enabled in th
36ce0 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69  is build, then i
36cf0 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20  sDirect.  ** is 
36d00 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
36d10 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
36d20 61 73 20 74 68 65 20 69 73 44 69 72 65 63 74 4d  as the isDirectM
36d30 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20  ode parameter.  
36d40 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
36d50 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ion. Otherwise, 
36d60 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  it is always set
36d70 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20   to zero..  **. 
36d80 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20   ** The idea is 
36d90 74 68 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d  that if the atom
36da0 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
36db0 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a  ation is not.  *
36dc0 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  * enabled at com
36dd0 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63  pile time, the c
36de0 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74  ompiler can omit
36df0 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20   the tests of.  
36e00 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62 65  ** 'isDirect' be
36e10 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20  low, as well as 
36e20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73  the block enclos
36e30 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22  ed in the.  ** "
36e40 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22 20  if( isDirect )" 
36e50 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  condition..  */.
36e60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
36e70 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
36e80 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45  TE.# define DIRE
36e90 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65  CT_MODE 0.  asse
36ea0 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65  rt( isDirectMode
36eb0 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==0 );.  UNUSED_
36ec0 50 41 52 41 4d 45 54 45 52 28 69 73 44 69 72 65  PARAMETER(isDire
36ed0 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23  ctMode);.#else.#
36ee0 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d   define DIRECT_M
36ef0 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65  ODE isDirectMode
36f00 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 21  .#endif..  if( !
36f10 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
36f20 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65  untDone && pPage
36f30 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20  r->dbSize>0 ){. 
36f40 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
36f50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36f60 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f   /* Reference to
36f70 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 20 20   page 1 */..    
36f80 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
36f90 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f  >tempFile && isO
36fa0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
36fb0 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  );..    /* Open 
36fc0 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69  page 1 of the fi
36fd0 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20  le for writing. 
36fe0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
36ff0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
37000 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b  er, 1, &pPgHdr);
37010 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
37020 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Hdr==0 || rc==SQ
37030 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
37040 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77  /* If page one w
37050 61 73 20 66 65 74 63 68 65 64 20 73 75 63 63 65  as fetched succe
37060 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69  ssfully, and thi
37070 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
37080 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  t.    ** operati
37090 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64  ng in direct-mod
370a0 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77  e, make page 1 w
370b0 72 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e  ritable.  When n
370c0 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69  ot in .    ** di
370d0 72 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65 20  rect mode, page 
370e0 31 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  1 is always held
370f0 20 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68 65   in cache and he
37100 6e 63 65 20 74 68 65 20 50 61 67 65 72 47 65 74  nce the PagerGet
37110 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  ().    ** above 
37120 69 73 20 61 6c 77 61 79 73 20 73 75 63 63 65 73  is always succes
37130 73 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68 65  sful - hence the
37140 20 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53   ALWAYS on rc==S
37150 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f  QLITE_OK..    */
37160 0a 20 20 20 20 69 66 28 20 21 44 49 52 45 43 54  .    if( !DIRECT
37170 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53 28  _MODE && ALWAYS(
37180 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  rc==SQLITE_OK) )
37190 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
371a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
371b0 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  PgHdr);.    }.. 
371c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
371d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
371e0 20 41 63 74 75 61 6c 6c 79 20 64 6f 20 74 68 65   Actually do the
371f0 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20 63   update of the c
37200 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 2a 2f  hange counter */
37210 0a 20 20 20 20 20 20 70 61 67 65 72 5f 77 72 69  .      pager_wri
37220 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
37230 28 70 50 67 48 64 72 29 3b 0a 0a 20 20 20 20 20  (pPgHdr);..     
37240 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69   /* If running i
37250 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77  n direct mode, w
37260 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
37270 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74  s of page 1 to t
37280 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  he file. */.    
37290 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44    if( DIRECT_MOD
372a0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  E ){.        con
372b0 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a 20  st void *zBuf;. 
372c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
372d0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
372e0 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 43  e>0 );.        C
372f0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 50  ODEC2(pPager, pP
37300 67 48 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c 20  gHdr->pData, 1, 
37310 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  6, rc=SQLITE_NOM
37320 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20  EM, zBuf);.     
37330 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
37360 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
37370 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
37380 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20  pageSize, 0);.  
37390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
373a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
373b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
373c0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
373d0 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  ntDone = 1;.    
373e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
373f0 65 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  e{.        pPage
37400 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
37410 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ne = 1;.      }.
37420 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
37430 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
37440 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
37450 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
37460 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a  ef(pPgHdr);.  }.
37470 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
37480 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
37490 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
374a0 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20  disk. This is a 
374b0 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d  no-op for in-mem
374c0 6f 72 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  ory databases.**
374d0 20 6f 72 20 70 61 67 65 73 20 77 69 74 68 20 74   or pages with t
374e0 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  he Pager.noSync 
374f0 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
37500 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
37510 72 20 69 66 20 63 61 6c 6c 65 64 20 6f 6e 20 61  r if called on a
37520 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68   pager for which
37530 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20   it is a no-op, 
37540 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
37550 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
37560 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  OK. Otherwise, a
37570 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
37580 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
37590 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
375a0 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  Sync(Pager *pPag
375b0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
375c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
375d0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
375e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
375f0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 72 63  !MEMDB );.    rc
37600 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
37610 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
37620 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
37630 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f  .  }else if( isO
37640 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
37650 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
37660 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 72 63 20  MEMDB );.    rc 
37670 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
37680 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
37690 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
376a0 53 59 4e 43 5f 4f 4d 49 54 54 45 44 2c 20 30 29  SYNC_OMITTED, 0)
376b0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
376c0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
376d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
376e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
376f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37700 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37710 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65  tion may only be
37720 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 20 61 20   called while a 
37730 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
37740 6e 20 69 73 20 61 63 74 69 76 65 20 69 6e 0a 2a  n is active in.*
37750 2a 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 74  * rollback. If t
37760 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
37770 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74 68   in WAL mode, th
37780 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
37790 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  op. .** Otherwis
377a0 65 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  e, if the connec
377b0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 6c  tion does not al
377c0 72 65 61 64 79 20 68 61 76 65 20 61 6e 20 45 58  ready have an EX
377d0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
377e0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
377f0 20 66 69 6c 65 2c 20 61 6e 20 61 74 74 65 6d 70   file, an attemp
37800 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
37810 61 69 6e 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49  ain one..**.** I
37820 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
37830 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
37840 68 65 6c 64 20 6f 72 20 74 68 65 20 61 74 74 65  held or the atte
37850 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 69 74  mpt to obtain it
37860 20 69 73 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   is.** successfu
37870 6c 2c 20 6f 72 20 74 68 65 20 63 6f 6e 6e 65 63  l, or the connec
37880 74 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d  tion is in WAL m
37890 6f 64 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ode, SQLITE_OK i
378a0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f  s returned..** O
378b0 74 68 65 72 77 69 73 65 2c 20 65 69 74 68 65 72  therwise, either
378c0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20   SQLITE_BUSY or 
378d0 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
378e0 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
378f0 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  s .** returned..
37900 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
37910 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  gerExclusiveLock
37920 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
37930 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37940 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
37950 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37960 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
37970 43 48 45 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c  CHEMOD .       |
37980 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
37990 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
379a0 42 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  BMOD .       || 
379b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
379c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
379d0 4b 45 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65  KED .  );.  asse
379e0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
379f0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
37a00 3b 0a 20 20 69 66 28 20 30 3d 3d 70 61 67 65 72  ;.  if( 0==pager
37a10 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
37a20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
37a30 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
37a40 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
37a50 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  LOCK);.  }.  ret
37a60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
37a70 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
37a80 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
37a90 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
37aa0 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
37ab0 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
37ac0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
37ad0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
37ae0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
37af0 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
37b00 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
37b10 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
37b20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
37b30 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
37b40 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
37b50 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
37b60 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
37b70 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
37b80 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
37b90 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  hat:.**.**   * T
37ba0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37bb0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
37bc0 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20  is updated,.**  
37bd0 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69   * the journal i
37be0 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65 73 73  s synced (unless
37bf0 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
37c00 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
37c10 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20  s used),.**   * 
37c20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
37c30 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74  are written to t
37c40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37c50 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  , .**   * the da
37c60 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
37c70 72 75 6e 63 61 74 65 64 20 28 69 66 20 72 65 71  runcated (if req
37c80 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20  uired), and.**  
37c90 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
37ca0 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a  file synced. .**
37cb0 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
37cc0 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20  ng that remains 
37cd0 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
37ce0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20  ansaction is to 
37cf0 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65  finalize .** (de
37d00 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65 20 6f  lete, truncate o
37d10 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74  r zero the first
37d20 20 70 61 72 74 20 6f 66 29 20 74 68 65 20 6a 6f   part of) the jo
37d30 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a  urnal file (or .
37d40 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ** delete the ma
37d50 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
37d60 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
37d70 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
37d80 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
37d90 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
37da0 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
37db0 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
37dc0 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
37dd0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
37de0 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a  aseOne() call..*
37df0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61  *.** If the fina
37e00 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f  l parameter - no
37e10 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20  Sync - is true, 
37e20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
37e30 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a  e file itself.**
37e40 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20   is not synced. 
37e50 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
37e60 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
37e70 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79  rSync() directly
37e80 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20   to.** sync the 
37e90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
37ea0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d  fore calling Com
37eb0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f  mitPhaseTwo() to
37ec0 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a   delete the.** j
37ed0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74  ournal file in t
37ee0 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74  his case..*/.int
37ef0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
37f00 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50  mitPhaseOne(.  P
37f10 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
37f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37f30 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
37f40 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
37f50 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20 20 20  zMaster,        
37f60 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
37f70 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  LL, the master j
37f80 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
37f90 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20 20   int noSync     
37fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37fb0 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
37fc0 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74 68   the xSync on th
37fd0 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  e db file */.){.
37fe0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37ff0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
38000 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
38010 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
38020 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
38030 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
38040 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  ED.       || pPa
38050 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
38060 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
38070 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  OD.       || pPa
38080 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
38090 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
380a0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
380b0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
380c0 45 52 52 4f 52 0a 20 20 29 3b 0a 20 20 61 73 73  ERROR.  );.  ass
380d0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
380e0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
380f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70 72  );..  /* If a pr
38100 69 6f 72 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ior error occurr
38110 65 64 2c 20 72 65 70 6f 72 74 20 74 68 61 74 20  ed, report that 
38120 65 72 72 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a  error again. */.
38130 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
38140 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
38150 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
38160 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54  rCode;..  PAGERT
38170 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20  RACE(("DATABASE 
38180 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
38190 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25  aster=%s nSize=%
381a0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
381b0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
381c0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
381d0 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a  >dbSize));..  /*
381e0 20 49 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   If no database 
381f0 63 68 61 6e 67 65 73 20 68 61 76 65 20 62 65 65  changes have bee
38200 6e 20 6d 61 64 65 2c 20 72 65 74 75 72 6e 20 65  n made, return e
38210 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70  arly. */.  if( p
38220 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41  Pager->eState<PA
38230 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
38240 4d 4f 44 20 29 20 72 65 74 75 72 6e 20 53 51 4c  MOD ) return SQL
38250 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 4d  ITE_OK;..  if( M
38260 45 4d 44 42 20 29 7b 0a 20 20 20 20 2f 2a 20 49  EMDB ){.    /* I
38270 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
38280 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
38290 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
382a0 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
382b0 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63  this.    ** func
382c0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
382d0 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74   been called, it
382e0 20 69 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d   is mostly a no-
382f0 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c 20 61 6e  op.  However, an
38300 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b 75 70 20  y.    ** backup 
38310 69 6e 20 70 72 6f 67 72 65 73 73 20 6e 65 65 64  in progress need
38320 73 20 74 6f 20 62 65 20 72 65 73 74 61 72 74 65  s to be restarte
38330 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
38340 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
38350 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
38360 75 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  up);.  }else{.  
38370 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
38380 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
38390 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20     PgHdr *pList 
383a0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
383b0 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
383c0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20  >pPCache);.     
383d0 20 50 67 48 64 72 20 2a 70 50 61 67 65 4f 6e 65   PgHdr *pPageOne
383e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
383f0 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
38400 20 20 20 20 2f 2a 20 4d 75 73 74 20 68 61 76 65      /* Must have
38410 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61   at least one pa
38420 67 65 20 66 6f 72 20 74 68 65 20 57 41 4c 20 63  ge for the WAL c
38430 6f 6d 6d 69 74 20 66 6c 61 67 2e 0a 20 20 20 20  ommit flag..    
38440 20 20 20 20 2a 2a 20 54 69 63 6b 65 74 20 5b 32      ** Ticket [2
38450 64 31 61 35 63 36 37 64 66 63 32 33 36 33 65 34  d1a5c67dfc2363e4
38460 34 66 32 39 64 39 62 62 64 35 37 66 5d 20 32 30  4f29d9bbd57f] 20
38470 31 31 2d 30 35 2d 31 38 20 2a 2f 0a 20 20 20 20  11-05-18 */.    
38480 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
38490 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
384a0 20 31 2c 20 26 70 50 61 67 65 4f 6e 65 29 3b 0a   1, &pPageOne);.
384b0 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20          pList = 
384c0 70 50 61 67 65 4f 6e 65 3b 0a 20 20 20 20 20 20  pPageOne;.      
384d0 20 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20    pList->pDirty 
384e0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
384f0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
38500 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
38510 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
38520 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  st) ){.        r
38530 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d  c = pagerWalFram
38540 65 73 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  es(pPager, pList
38550 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
38560 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
38570 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
38580 55 6e 72 65 66 28 70 50 61 67 65 4f 6e 65 29 3b  Unref(pPageOne);
38590 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
385a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
385b0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
385c0 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
385d0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
385e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
385f0 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
38600 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61  owing block upda
38610 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63  tes the change-c
38620 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20  ounter. Exactly 
38630 68 6f 77 20 69 74 0a 20 20 20 20 20 20 2a 2a 20  how it.      ** 
38640 64 6f 65 73 20 74 68 69 73 20 64 65 70 65 6e 64  does this depend
38650 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
38660 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75  not the atomic-u
38670 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  pdate optimizati
38680 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20  on.      ** was 
38690 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
386a0 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20  le time, and if 
386b0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
386c0 20 6d 65 65 74 73 20 74 68 65 20 0a 20 20 20 20   meets the .    
386d0 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69    ** runtime cri
386e0 74 65 72 69 61 20 74 6f 20 75 73 65 20 74 68 65  teria to use the
386f0 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20   operation: .   
38700 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
38710 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73    * The file-sys
38720 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
38730 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   a