/ Hex Artifact Content
Login

Artifact 0ae6079dd6109d475e54ff2ce3131dd0a3fea24f:


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 31 29 3b 0a 20 20 69  terPtr + 1);.  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 31 5d 3b 0a 20 20 72 63 20  ournal+1];.  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 20 20 7a 4d  master_out;.  zM
187b0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
187c0 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30  sterJournal] = 0
187d0 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ;..  zJournal = 
187e0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
187f0 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
18800 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
18810 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
18820 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69  l ){.    int exi
18830 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  sts;.    rc = sq
18840 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
18850 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
18860 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
18870 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
18880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18890 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
188a0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
188b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
188c0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f  xists ){.      /
188d0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
188e0 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
188f0 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
18900 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
18910 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
18920 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
18930 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
18940 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
18950 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65  .      ** so, re
18960 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
18970 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
18980 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
18990 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
189a0 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  t c;.      int f
189b0 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
189c0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
189d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
189e0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63  URNAL);.      rc
189f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
18a00 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
18a10 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
18a20 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
18a30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18a40 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
18a50 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18a60 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d     }..      rc =
18a70 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
18a80 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
18a90 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
18aa0 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Ptr);.      sqli
18ab0 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
18ac0 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
18ad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18ae0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
18af0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18b00 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20     }..      c = 
18b10 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
18b20 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
18b30 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
18b40 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20  =0;.      if( c 
18b50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
18b60 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
18b70 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
18b80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18b90 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
18ba0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18bb0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
18bc0 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20   }.    zJournal 
18bd0 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
18be0 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  n30(zJournal)+1)
18bf0 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65  ;.  }. .  sqlite
18c00 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
18c10 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
18c20 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
18c30 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
18c40 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73  lmaster_out:.  s
18c50 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
18c60 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
18c70 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
18c80 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
18c90 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
18ca0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
18cb0 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20  Journal) );.    
18cc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
18cd0 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
18ce0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
18cf0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
18d00 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67  is used to chang
18d10 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a  e the actual siz
18d20 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
18d30 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68  e .** file in th
18d40 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
18d50 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
18d60 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
18d70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
18d80 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  ** or rolling ba
18d90 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
18da0 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c   (including roll
18db0 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
18dc0 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49  ournal)..**.** I
18dd0 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
18de0 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
18df0 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67  open, or the pag
18e00 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74  er is not in eit
18e10 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20  her.** DBMOD or 
18e20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73  OPEN state, this
18e30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
18e40 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
18e50 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66   the size .** of
18e60 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61   the file is cha
18e70 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
18e80 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
18e90 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
18ea0 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66  s). .** If the f
18eb0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63  ile on disk is c
18ec0 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20  urrently larger 
18ed0 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73  than nPage pages
18ee0 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56  , then use the V
18ef0 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28  FS.** xTruncate(
18f00 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e  ) method to trun
18f10 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f  cate it..**.** O
18f20 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68  r, it might migh
18f30 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
18f40 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  at the file on d
18f50 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  isk is smaller t
18f60 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61  han .** nPage pa
18f70 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74  ges. Some operat
18f80 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65  ing system imple
18f90 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67  mentations can g
18fa0 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a  et confused if .
18fb0 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72  ** you try to tr
18fc0 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
18fd0 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20   some size that 
18fe0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
18ff0 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  t .** currently 
19000 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68  is, so detect th
19010 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74  is case and writ
19020 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20  e a single zero 
19030 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20  byte to .** the 
19040 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66  end of the new f
19050 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  ile instead..**.
19060 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
19070 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
19080 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  OK. If an IO err
19090 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
190a0 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65  modifying.** the
190b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
190c0 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
190d0 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
190e0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
190f0 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
19100 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
19110 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
19120 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19130 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
19140 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
19150 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
19160 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
19170 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41  State!=PAGER_REA
19180 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20  DER );.  .  if( 
19190 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
191a0 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65  d) .   && (pPage
191b0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
191c0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
191d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
191e0 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20  =PAGER_OPEN) .  
191f0 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65  ){.    i64 curre
19200 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b  ntSize, newSize;
19210 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20  .    int szPage 
19220 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
19230 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
19240 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
19250 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
19260 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  .    /* TODO: Is
19270 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20   it safe to use 
19280 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
19290 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63   here? */.    rc
192a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
192b0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
192c0 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
192d0 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a      newSize = sz
192e0 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b  Page*(i64)nPage;
192f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
19300 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e  ITE_OK && curren
19310 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29  tSize!=newSize )
19320 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72  {.      if( curr
19330 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20  entSize>newSize 
19340 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19350 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
19360 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65  e(pPager->fd, ne
19370 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  wSize);.      }e
19380 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61  lse{.        cha
19390 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
193a0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
193b0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
193c0 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
193d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
193e0 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
193f0 20 3c 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20   <  currentSize 
19400 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
19410 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
19420 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74  Page) == current
19430 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
19440 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69  testcase( (newSi
19450 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75  ze-szPage) >  cu
19460 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  rrentSize );.   
19470 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19480 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
19490 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67  >fd, pTmp, szPag
194a0 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  e, newSize-szPag
194b0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
194c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
194d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
194e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
194f0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
19500 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
19510 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19520 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
19530 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
19540 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
19550 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
19560 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
19570 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
19580 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
19590 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
195a0 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
195b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
195c0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
195d0 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a  l be used used .
195e0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
195f0 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
19600 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
19610 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
19620 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19630 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
19640 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
19650 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
19660 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
19670 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
19680 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
19690 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
196a0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
196b0 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
196c0 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
196d0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
196e0 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
196f0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
19700 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
19710 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
19720 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20   up to 32 if.** 
19730 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
19740 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  32, or rounded d
19750 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
19760 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
19770 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
19780 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
19790 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
197a0 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54  le has the SQLIT
197b0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
197c0 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70  E_OVERWRITE prop
197d0 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a  erty, then set.*
197e0 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  * the effective 
197f0 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69  sector size to i
19800 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  ts minimum value
19810 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72   (512).  The pur
19820 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65  pose of.** pPage
19830 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  r->sectorSize is
19840 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22   to define the "
19850 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66  blast radius" of
19860 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d   bytes that.** m
19870 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61  ight change if a
19880 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68   crash occurs wh
19890 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ile writing to a
198a0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a   single byte in.
198b0 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20  ** that range.  
198c0 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41  But with POWERSA
198d0 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68  FE_OVERWRITE, th
198e0 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69  e blast radius i
198f0 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20  s zero.** (that 
19900 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46  is what POWERSAF
19910 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e  E_OVERWRITE mean
19920 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69  s), so we minimi
19930 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a  ze the sector.**
19940 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b   size.  For back
19950 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
19960 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ity of the rollb
19970 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
19980 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63   format,.** we c
19990 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65  annot reduce the
199a0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
199b0 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32  r size below 512
199c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
199d0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
199e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
199f0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
19a00 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
19a10 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
19a20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
19a30 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c  ->tempFile.   ||
19a40 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
19a50 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
19a60 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a  (pPager->fd) & .
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19a80 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
19a90 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21  SAFE_OVERWRITE)!
19aa0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =0.  ){.    /* S
19ab0 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
19ac0 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
19ad0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
19ae0 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
19af0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
19b00 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
19b10 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
19b20 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
19b30 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
19b40 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a  will segfault. *
19b50 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
19b60 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
19b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
19b80 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
19b90 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
19ba0 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
19bb0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
19bc0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 33 32  r->sectorSize<32
19bd0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
19be0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
19bf0 31 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  12;.    }.    if
19c00 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
19c10 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
19c20 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 61 73  SIZE ){.      as
19c30 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
19c40 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
19c50 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
19c60 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43  orSize = MAX_SEC
19c70 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  TOR_SIZE;.    }.
19c80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
19c90 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
19ca0 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
19cb0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
19cc0 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
19cd0 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
19ce0 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
19cf0 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
19d00 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
19d10 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
19d20 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
19d30 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
19d40 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
19d50 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
19d60 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
19d70 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
19d80 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
19d90 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
19da0 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
19db0 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
19dc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
19dd0 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
19de0 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
19df0 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
19e00 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
19e10 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
19e20 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
19e30 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
19e40 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
19e50 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
19e60 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
19e70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
19e80 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
19e90 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
19ea0 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
19eb0 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
19ec0 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
19ed0 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
19ee0 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
19ef0 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
19f00 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
19f10 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
19f20 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
19f30 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
19f40 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
19f50 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
19f60 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
19f70 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
19f80 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
19f90 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
19fa0 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  page size..**  (
19fb0 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67  7)  zero padding
19fc0 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74   out to the next
19fd0 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a   sector size..**
19fe0 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (8)  Zero or m
19ff0 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
1a000 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
1a010 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
1a020 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
1a030 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
1a040 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
1a050 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
1a060 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
1a070 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
1a080 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
1a090 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
1a0a0 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
1a0b0 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20  ean the first 7 
1a0c0 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
1a0d0 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
1a0e0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
1a0f0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1a100 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  8th item..**.** 
1a110 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
1a120 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
1a130 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
1a140 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
1a150 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
1a160 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
1a170 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
1a180 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
1a190 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
1a1a0 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
1a1b0 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
1a1c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a1d0 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
1a1e0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
1a1f0 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
1a200 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
1a210 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
1a220 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
1a230 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
1a240 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1a250 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
1a260 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
1a270 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
1a280 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
1a290 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
1a2a0 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
1a2b0 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
1a2c0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1a2d0 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
1a2e0 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
1a2f0 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
1a300 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
1a310 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
1a320 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
1a330 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
1a340 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
1a350 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
1a360 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
1a370 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
1a380 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1a390 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
1a3a0 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
1a3b0 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
1a3c0 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
1a3d0 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
1a3e0 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
1a3f0 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
1a400 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
1a410 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
1a420 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
1a430 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
1a440 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
1a450 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
1a460 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
1a470 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
1a480 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
1a490 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
1a4a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1a4b0 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
1a4c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1a4d0 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
1a4e0 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
1a4f0 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
1a500 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
1a510 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
1a520 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
1a530 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
1a540 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
1a550 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
1a560 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
1a570 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
1a580 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
1a590 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
1a5a0 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
1a5b0 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
1a5c0 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
1a5d0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
1a5e0 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
1a5f0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
1a600 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
1a610 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
1a620 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
1a630 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
1a640 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70  *.** The isHot p
1a650 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
1a660 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74  es that we are t
1a670 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  rying to rollbac
1a680 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74  k a journal.** t
1a690 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68  hat might be a h
1a6a0 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c  ot journal.  Or,
1a6b0 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
1a6c0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
1a6d0 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62   .** preserved b
1a6e0 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41  ecause of JOURNA
1a6f0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72  LMODE_PERSIST or
1a700 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55   JOURNALMODE_TRU
1a710 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65  NCATE..** If the
1a720 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20   journal really 
1a730 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68  is hot, reset th
1a740 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72  e pager cache pr
1a750 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62  ior rolling.** b
1a760 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e  ack any content.
1a770 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    If the journal
1a780 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69   is merely persi
1a790 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20  stent, no reset 
1a7a0 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f  is.** needed..*/
1a7b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1a7c0 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
1a7d0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
1a7e0 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
1a7f0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
1a800 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
1a810 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
1a820 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a830 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a840 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
1a850 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
1a860 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a870 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
1a880 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
1a890 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
1a8a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
1a8b0 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
1a8c0 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
1a8d0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
1a8e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1a8f0 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
1a900 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
1a910 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1a920 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1a930 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
1a940 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
1a950 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1a960 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
1a970 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
1a980 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
1a990 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
1a9a0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1a9b0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
1a9c0 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
1a9d0 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52    int needPagerR
1a9e0 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  eset;      /* Tr
1a9f0 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65  ue to reset page
1aa00 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20   prior to first 
1aa10 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  page rollback */
1aa20 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1aa30 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
1aa40 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
1aa50 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
1aa60 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
1aa70 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
1aa80 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1aa90 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1aaa0 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
1aab0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1aac0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
1aad0 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
1aae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1aaf0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1ab00 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
1ab10 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
1ab20 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
1ab30 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
1ab40 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
1ab50 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
1ab60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1ab70 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
1ab80 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
1ab90 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
1aba0 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
1abb0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
1abc0 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
1abd0 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
1abe0 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
1abf0 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54   **.  ** TODO: T
1ac00 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66  echnically the f
1ac10 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65  ollowing is an e
1ac20 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  rror because it 
1ac30 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a  assumes that.  *
1ac40 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70  * buffer Pager.p
1ac50 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50  TmpSpace is (mxP
1ac60 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73  athname+1) bytes
1ac70 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e   or larger. i.e.
1ac80 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67   that.  ** (pPag
1ac90 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20  er->pageSize >= 
1aca0 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1acb0 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69  Pathname+1). Usi
1acc0 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20  ng os_unix.c,.  
1acd0 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69  **  mxPathname i
1ace0 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
1acf0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1ad00 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
1ad10 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
1ad20 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
1ad30 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1ad40 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1ad50 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1ad60 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1ad70 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1ad80 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1ad90 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
1ada0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1adb0 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
1adc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1add0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1ade0 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
1adf0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
1ae00 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
1ae10 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
1ae20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
1ae30 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
1ae40 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1ae50 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
1ae60 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
1ae70 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
1ae80 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
1ae90 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
1aea0 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
1aeb0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
1aec0 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
1aed0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1aee0 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
1aef0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
1af00 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
1af10 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
1af20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1af30 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
1af40 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
1af50 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1af60 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
1af70 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
1af80 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
1af90 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
1afa0 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
1afb0 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
1afc0 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
1afd0 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
1afe0 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76  process must hav
1aff0 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  e failed while w
1b000 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
1b010 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
1b020 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
1b030 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
1b040 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
1b050 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
1b060 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
1b070 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
1b080 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
1b090 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b0a0 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
1b0b0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1b0c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1b0d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1b0e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1b0f0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
1b100 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
1b110 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1b120 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
1b130 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1b140 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
1b150 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
1b160 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
1b170 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
1b180 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1b190 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
1b1a0 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
1b1b0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
1b1c0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1b1d0 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
1b1e0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1b1f0 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
1b200 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
1b210 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1b220 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
1b230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b240 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b250 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1b260 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
1b270 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1b280 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
1b290 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
1b2a0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1b2b0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1b2c0 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1b2d0 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
1b2e0 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
1b2f0 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
1b300 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
1b310 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
1b320 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
1b330 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
1b340 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
1b350 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
1b360 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
1b370 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1b380 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
1b390 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
1b3a0 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
1b3b0 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
1b3c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1b3d0 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
1b3e0 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
1b3f0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
1b400 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1b410 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
1b420 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
1b430 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
1b440 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
1b450 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
1b460 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
1b470 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
1b480 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
1b490 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
1b4a0 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
1b4b0 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
1b4c0 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
1b4d0 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
1b4e0 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
1b4f0 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
1b500 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
1b510 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
1b520 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
1b530 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
1b540 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
1b550 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
1b560 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
1b570 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
1b580 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
1b590 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
1b5a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1b5b0 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
1b5c0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
1b5d0 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
1b5e0 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
1b5f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1b600 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
1b610 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1b620 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1b630 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b640 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1b650 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
1b660 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1b670 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
1b680 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
1b690 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1b6a0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1b6b0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1b6c0 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
1b6d0 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
1b6e0 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
1b6f0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1b700 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
1b710 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
1b720 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b730 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b740 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
1b750 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
1b760 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1b770 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1b780 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
1b790 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b7a0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1b7b0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b7c0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1b7d0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
1b7e0 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
1b7f0 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
1b800 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
1b810 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
1b820 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
1b830 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1b840 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
1b850 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
1b860 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
1b870 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
1b880 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
1b890 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1b8a0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1b8b0 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
1b8c0 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
1b8d0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
1b8e0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1b8f0 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
1b900 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1b910 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
1b920 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b930 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
1b940 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1b950 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
1b960 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1b970 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
1b980 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1b990 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
1b9a0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1b9b0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
1b9c0 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
1b9d0 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75  nal has been tru
1b9e0 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73  ncated, simply s
1b9f0 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a  top reading and.
1ba00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1ba10 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72  cessing the jour
1ba20 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20  nal. This might 
1ba30 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f  happen if the jo
1ba40 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20  urnal was.      
1ba50 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c      ** not compl
1ba60 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e  etely written an
1ba70 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  d synced prior t
1ba80 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74  o a crash.  In t
1ba90 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1baa0 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62   case, the datab
1bab0 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ase should have 
1bac0 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74  never been writt
1bad0 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  en in the.      
1bae0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61      ** first pla
1baf0 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74  ce so it is OK t
1bb00 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e  o simply abandon
1bb10 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a   the rollback. *
1bb20 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
1bb30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1bb40 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1bb50 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
1bb60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bb70 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75    /* If we are u
1bb80 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  nable to rollbac
1bb90 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75  k, quit and retu
1bba0 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  rn the error.   
1bbb0 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20         ** code. 
1bbc0 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
1bbd0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
1bbe0 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
1bbf0 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ate.          **
1bc00 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74   so that no furt
1bc10 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65  her harm will be
1bc20 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20   done.  Perhaps 
1bc30 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20  the next.       
1bc40 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f     ** process to
1bc50 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c   come along will
1bc60 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c   be able to roll
1bc70 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
1bc80 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1bc90 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1bca0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1bcb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1bcc0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
1bcd0 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
1bce0 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
1bcf0 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c  ayback:.  /* Fol
1bd00 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
1bd10 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
1bd20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
1bd30 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
1bd40 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
1bd50 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
1bd60 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
1bd70 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
1bd80 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
1bd90 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1bda0 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
1bdb0 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
1bdc0 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
1bdd0 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
1bde0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1bdf0 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
1be00 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 0a 20    */.  assert(. 
1be10 20 20 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70     pPager->fd->p
1be20 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20  Methods==0 ||.  
1be30 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
1be40 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
1be50 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  d,SQLITE_FCNTL_D
1be60 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d  B_UNCHANGED,0)>=
1be70 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a  SQLITE_OK.  );..
1be80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61    /* If this pla
1be90 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69  yback is happeni
1bea0 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ng automatically
1beb0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
1bec0 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d  an IO or .  ** m
1bed0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74  alloc error that
1bee0 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20   occurred after 
1bef0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1bf00 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62  er was updated b
1bf10 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20  ut .  ** before 
1bf20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1bf30 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  was committed, t
1bf40 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hen the change-c
1bf50 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64  ounter .  ** mod
1bf60 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75  ification may ju
1bf70 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76  st have been rev
1bf80 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68  erted. If this h
1bf90 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73  appens in exclus
1bfa0 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20  ive .  ** mode, 
1bfb0 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
1bfc0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72  transactions per
1bfd0 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f  formed by the co
1bfe0 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f  nnection will no
1bff0 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68  t.  ** update th
1c000 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1c010 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61   at all. This ma
1c020 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20  y lead to cache 
1c030 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20  inconsistency.  
1c040 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  ** problems for 
1c050 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
1c060 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
1c070 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c   the future. So,
1c080 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61   just.  ** in ca
1c090 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70  se this has happ
1c0a0 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20  ened, clear the 
1c0b0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1c0c0 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  flag now..  */. 
1c0d0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
1c0e0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
1c0f0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
1c100 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c110 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
1c120 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1c130 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
1c140 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
1c150 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
1c160 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
1c170 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1c180 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
1c190 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c1a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1c1b0 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
1c1c0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
1c1d0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
1c1e0 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
1c1f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1c200 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  EN).  ){.    rc 
1c210 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  = sqlite3PagerSy
1c220 6e 63 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  nc(pPager);.  }.
1c230 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c240 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1c250 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
1c260 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
1c270 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
1c280 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1c290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1c2a0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1c2b0 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1c2c0 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
1c2d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1c2e0 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
1c2f0 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
1c300 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
1c310 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
1c320 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
1c330 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
1c340 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
1c350 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
1c360 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
1c370 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
1c380 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
1c390 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1c3a0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
1c3b0 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
1c3c0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
1c3d0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
1c3e0 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
1c3f0 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
1c400 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
1c410 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
1c420 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
1c430 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
1c440 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
1c450 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1c460 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
1c470 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
1c480 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1c490 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c4a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
1c4b0 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
1c4c0 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1c4d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c4e0 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
1c4f0 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1c500 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1c510 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1c520 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1c530 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1c540 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c550 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1c560 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1c570 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1c580 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1c590 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1c5a0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1c5b0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1c5c0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1c5d0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1c5e0 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1c5f0 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1c600 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1c610 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1c620 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1c630 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1c640 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1c650 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1c660 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1c670 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
1c680 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
1c690 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1c6a0 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
1c6b0 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
1c6c0 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
1c6d0 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
1c6e0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1c6f0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1c700 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1c710 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61   */.  int isInWa
1c720 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
1c730 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61     /* True if pa
1c740 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c  ge is in log fil
1c750 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1c760 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1c770 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1c780 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1c790 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1c7a0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1c7b0 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1c7c0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1c7d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1c7e0 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  fd) );..  if( NE
1c7f0 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67  VER(!isOpen(pPag
1c800 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
1c810 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c820 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1c830 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
1c840 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
1c850 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74  geSize);.    ret
1c860 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c870 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
1c880 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
1c890 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70  .    /* Try to p
1c8a0 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f  ull the page fro
1c8b0 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  m the write-ahea
1c8c0 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63  d log. */.    rc
1c8d0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61   = sqlite3WalRea
1c8e0 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  d(pPager->pWal, 
1c8f0 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20  pgno, &isInWal, 
1c900 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61  pgsz, pPg->pData
1c910 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1c920 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69  =SQLITE_OK && !i
1c930 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36  sInWal ){.    i6
1c940 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
1c950 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1c960 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1c970 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1c980 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1c990 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
1c9a0 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1c9b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1c9c0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1c9d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c9e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1c9f0 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
1ca00 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
1ca10 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1ca20 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
1ca30 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1ca40 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
1ca50 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
1ca60 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
1ca70 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
1ca80 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
1ca90 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
1caa0 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
1cab0 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
1cac0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
1cad0 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
1cae0 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
1caf0 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
1cb00 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1cb10 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
1cb20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
1cb30 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
1cb40 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
1cb50 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
1cb60 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
1cb70 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
1cb80 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
1cb90 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
1cba0 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
1cbb0 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
1cbc0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1cbd0 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
1cbe0 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
1cbf0 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
1cc00 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
1cc10 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
1cc20 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1cc30 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
1cc40 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
1cc50 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
1cc60 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
1cc70 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36  sing equaling 16
1cc80 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69   bytes of 0xff i
1cc90 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  s vanishingly sm
1cca0 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20  all so.      ** 
1ccb0 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20  we should still 
1ccc0 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  be ok..      */.
1ccd0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
1cce0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1ccf0 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50   0xff, sizeof(pP
1cd00 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1cd10 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
1cd20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56       u8 *dbFileV
1cd30 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67  ers = &((u8*)pPg
1cd40 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20  ->pData)[24];.  
1cd50 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1cd60 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1cd70 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
1cd80 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1cd90 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20  eVers));.    }. 
1cda0 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
1cdb0 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
1cdc0 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51  pgno, 3, rc = SQ
1cdd0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20  LITE_NOMEM);..  
1cde0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1cdf0 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
1ce00 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
1ce10 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
1ce20 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
1ce30 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
1ce40 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1ce50 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
1ce60 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
1ce70 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1ce90 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1cea0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
1ceb0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
1cec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ced0 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76 61  ** Update the va
1cee0 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67  lue of the chang
1cef0 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66  e-counter at off
1cf00 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20 69  sets 24 and 92 i
1cf10 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  n.** the header 
1cf20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20 76  and the sqlite v
1cf30 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74  ersion number at
1cf40 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a   offset 96..**.*
1cf50 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63  * This is an unc
1cf60 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74  onditional updat
1cf70 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65  e.  See also the
1cf80 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1cf90 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72  gecounter().** r
1cfa0 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c  outine which onl
1cfb0 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68  y updates the ch
1cfc0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20  ange-counter if 
1cfd0 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61 63  the update is ac
1cfe0 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64  tually.** needed
1cff0 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20  , as determined 
1d000 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63  by the pPager->c
1d010 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73  hangeCountDone s
1d020 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a  tate variable..*
1d030 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
1d040 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
1d050 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70  counter(PgHdr *p
1d060 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67  Pg){.  u32 chang
1d070 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a  e_counter;..  /*
1d080 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
1d090 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
1d0a0 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
1d0b0 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
1d0c0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
1d0d0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
1d0e0 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61  te((u8*)pPg->pPa
1d0f0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1d100 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  +1;.  put32bits(
1d110 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1d120 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
1d130 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41  ounter);..  /* A
1d140 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51  lso store the SQ
1d150 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  Lite version num
1d160 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e  ber in bytes 96.
1d170 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20  .99 and in.  ** 
1d180 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f  bytes 92..95 sto
1d190 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  re the change co
1d1a0 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20  unter for which 
1d1b0 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  the version numb
1d1c0 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64  er.  ** is valid
1d1d0 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
1d1e0 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1d1f0 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f  ata)+92, change_
1d200 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33  counter);.  put3
1d210 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1d220 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51  g->pData)+96, SQ
1d230 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
1d240 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  BER);.}..#ifndef
1d250 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1d260 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1d270 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
1d280 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61  once for each pa
1d290 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  ge that has alre
1d2a0 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69  ady been .** wri
1d2b0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f  tten into the lo
1d2c0 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41  g file when a WA
1d2d0 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
1d2e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
1d2f0 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69   Parameter iPg i
1d300 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1d310 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20  r of said page. 
1d320 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e  The pCtx argumen
1d330 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c  t .** is actuall
1d340 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
1d350 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1d360 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  re..**.** If pag
1d370 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74  e iPg is present
1d380 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61   in the cache, a
1d390 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  nd has no outsta
1d3a0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
1d3b0 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61  ,.** it is disca
1d3c0 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rded. Otherwise,
1d3d0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e   if there are on
1d3e0 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61  e or more outsta
1d3f0 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e  nding.** referen
1d400 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f  ces, the page co
1d410 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65  ntent is reloade
1d420 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1d430 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61  ase. If the.** a
1d440 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64  ttempt to reload
1d450 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1d460 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
1d470 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73  quired and fails
1d480 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  , .** return an 
1d490 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1d4a0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
1d4b0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
1d4c0 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f  ic int pagerUndo
1d4d0 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
1d4e0 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a  Ctx, Pgno iPg){.
1d4f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d500 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1d510 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
1d520 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a  )pCtx;.  PgHdr *
1d530 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71  pPg;..  pPg = sq
1d540 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1d550 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20  (pPager, iPg);. 
1d560 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
1d570 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
1d580 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
1d590 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  g)==1 ){.      s
1d5a0 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
1d5b0 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
1d5c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
1d5d0 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
1d5e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d5f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d600 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1d610 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  er(pPg);.      }
1d620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1d630 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1d640 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
1d650 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72  ormally, if a tr
1d660 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1d670 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61  led back, any ba
1d680 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61  ckup processes a
1d690 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  re.  ** updated 
1d6a0 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65  as data is copie
1d6b0 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c  d out of the rol
1d6c0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
1d6d0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  d into the.  ** 
1d6e0 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
1d6f0 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20  s not generally 
1d700 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20  possible with a 
1d710 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73  WAL database, as
1d720 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69  .  ** rollback i
1d730 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74  nvolves simply t
1d740 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f  runcating the lo
1d750 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  g file. Therefor
1d760 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f  e, if one.  ** o
1d770 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61  r more frames ha
1d780 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1d790 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
1d7a0 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  og (and therefor
1d7b0 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70  e .  ** also cop
1d7c0 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63  ied into the bac
1d7d0 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61  kup databases) a
1d7e0 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  s part of this t
1d7f0 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a  ransaction,.  **
1d800 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73   the backups mus
1d810 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  t be restarted..
1d820 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61    */.  sqlite3Ba
1d830 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
1d840 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20  er->pBackup);.. 
1d850 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d860 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1d870 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1d880 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  rollback a trans
1d890 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20  action on a WAL 
1d8a0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1d8b0 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c  tic int pagerRol
1d8c0 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a  lbackWal(Pager *
1d8d0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1d8e0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1d8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d900 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
1d910 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20  gHdr *pList;    
1d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d930 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20  * List of dirty 
1d940 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20  pages to revert 
1d950 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c  */..  /* For all
1d960 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
1d970 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72  che that are cur
1d980 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20  rently dirty or 
1d990 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
1d9a0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28  * been written (
1d9b0 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  but not committe
1d9c0 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  d) to the log fi
1d9d0 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68  le, do one of th
1d9e0 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  e .  ** followin
1d9f0 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b  g:.  **.  **   +
1da00 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63   Discard the cac
1da10 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66  hed page (if ref
1da20 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20  count==0), or.  
1da30 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61  **   + Reload pa
1da40 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ge content from 
1da50 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66  the database (if
1da60 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20   refcount>0)..  
1da70 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
1da80 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1da90 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d  OrigSize;.  rc =
1daa0 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28   sqlite3WalUndo(
1dab0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61  pPager->pWal, pa
1dac0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c  gerUndoCallback,
1dad0 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29   (void *)pPager)
1dae0 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
1daf0 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1db00 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1db10 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  he);.  while( pL
1db20 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ist && rc==SQLIT
1db30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64  E_OK ){.    PgHd
1db40 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
1db50 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63  ->pDirty;.    rc
1db60 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c   = pagerUndoCall
1db70 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61  back((void *)pPa
1db80 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
1db90 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
1dba0 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Next;.  }..  ret
1dbb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1dbc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1dbd0 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
1dbe0 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61  nd sqlite3WalFra
1dbf0 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61  mes(). As well a
1dc00 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65  s logging.** the
1dc10 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1dc20 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68   list of pages h
1dc30 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28  eaded by pList (
1dc40 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
1dc50 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  rty),.** this fu
1dc60 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20  nction notifies 
1dc70 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75  any active backu
1dc80 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74  p processes that
1dc90 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a   the pages have.
1dca0 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a  ** changed. .**.
1dcb0 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70  ** The list of p
1dcc0 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f  ages passed into
1dcd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1dce0 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62   always sorted b
1dcf0 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  y page number..*
1dd00 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65  * Hence, if page
1dd10 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68   1 appears anywh
1dd20 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c  ere on the list,
1dd30 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20   it will be the 
1dd40 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a  first page..*/ .
1dd50 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1dd60 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67  WalFrames(.  Pag
1dd70 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dd90 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1dda0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20    PgHdr *pList, 
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61    /* List of fra
1ddd0 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20  mes to log */.  
1dde0 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20  Pgno nTruncate, 
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de00 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1de10 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d   after this comm
1de20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  it */.  int isCo
1de30 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1de40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1de50 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  if this is a com
1de60 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  mit */.){.  int 
1de70 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1de80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1de90 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 23 69  eturn code */.#i
1dea0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1deb0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1dec0 65 64 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ed(SQLITE_CHECK_
1ded0 50 41 47 45 53 29 0a 20 20 50 67 48 64 72 20 2a  PAGES).  PgHdr *
1dee0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1def0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1df00 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67  looping over pag
1df10 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  es */.#endif..  
1df20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1df30 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  pWal );.  assert
1df40 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65  ( pList );.#ifde
1df50 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1df60 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1df70 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73  the page list is
1df80 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
1df90 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70  der */.  for(p=p
1dfa0 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44  List; p && p->pD
1dfb0 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74  irty; p=p->pDirt
1dfc0 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
1dfd0 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69  p->pgno < p->pDi
1dfe0 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d  rty->pgno );.  }
1dff0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
1e000 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f  sCommit ){.    /
1e010 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73  * If a WAL trans
1e020 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
1e030 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65  committed, there
1e040 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1e050 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61  writing.    ** a
1e060 6e 79 20 70 61 67 65 73 20 77 69 74 68 20 70 61  ny pages with pa
1e070 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
1e080 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74  er than nTruncat
1e090 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66  e into the WAL f
1e0a0 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79  ile..    ** They
1e0b0 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72   will never be r
1e0c0 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e  ead by any clien
1e0d0 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65  t. So remove the
1e0e0 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74  m from the pDirt
1e0f0 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65  y.    ** list he
1e100 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72  re. */.    PgHdr
1e110 20 2a 70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a   *p;.    PgHdr *
1e120 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74  *ppNext = &pList
1e130 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  ;.    for(p=pLis
1e140 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29  t; (*ppNext = p)
1e150 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1e160 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
1e170 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 20 70  o<=nTruncate ) p
1e180 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72  pNext = &p->pDir
1e190 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ty;.    }.    as
1e1a0 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20  sert( pList );. 
1e1b0 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d   }..  if( pList-
1e1c0 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1e1d0 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1e1e0 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1e1f0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1e200 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1e210 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1e220 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1e230 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1e240 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1e250 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1e260 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1e270 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1e280 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1e290 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
1e2a0 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1e2b0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1e2c0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
1e2d0 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
1e2e0 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20  ackup, p->pgno, 
1e2f0 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b  (u8 *)p->pData);
1e300 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
1e310 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1e320 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20  PAGES.  pList = 
1e330 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1e340 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1e350 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70  PCache);.  for(p
1e360 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
1e370 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67  pDirty){.    pag
1e380 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
1e390 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  p);.  }.#endif..
1e3a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e3b0 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65  /*.** Begin a re
1e3c0 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ad transaction o
1e3d0 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a  n the WAL..**.**
1e3e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   This routine us
1e3f0 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
1e400 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68  "pagerOpenSnapsh
1e410 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74  ot()" because it
1e420 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20   essentially.** 
1e430 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74  makes a snapshot
1e440 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e450 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
1e460 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e  point in time an
1e470 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74  d preserves.** t
1e480 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72  hat snapshot for
1e490 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64   use by the read
1e4a0 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63  er in spite of c
1e4b0 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e  oncurrently chan
1e4c0 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20  ges by.** other 
1e4d0 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b  writers or check
1e4e0 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  pointers..*/.sta
1e4f0 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67  tic int pagerBeg
1e500 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
1e510 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
1e520 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e540 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1e550 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e  de */.  int chan
1e560 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ged = 0;        
1e570 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e580 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  if cache must be
1e590 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73   reset */..  ass
1e5a0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
1e5b0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
1e5c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1e5d0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1e5e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1e5f0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
1e600 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65   );..  /* sqlite
1e610 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
1e620 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74  action() was not
1e630 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
1e640 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72  previous.  ** tr
1e650 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63  ansaction in loc
1e660 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
1e670 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74  IVE.  So call it
1e680 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a   now.  If we.  *
1e690 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67  * are in locking
1e6a0 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64  _mode=NORMAL and
1e6b0 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70   EndRead() was p
1e6c0 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
1e6d0 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69  ,.  ** the dupli
1e6e0 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72  cate call is har
1e6f0 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  mless..  */.  sq
1e700 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
1e710 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1e720 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20  r->pWal);..  rc 
1e730 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
1e740 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
1e750 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26  (pPager->pWal, &
1e760 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20  changed);.  if( 
1e770 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1e780 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20   changed ){.    
1e790 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1e7a0 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  er);.  }..  retu
1e7b0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1e7c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1e7d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
1e7e0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72  s part of the tr
1e7f0 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41  ansition from PA
1e800 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50  GER_OPEN.** to P
1e810 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
1e820 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
1e830 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1e840 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
1e850 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69  in pages (assumi
1e860 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ng the page size
1e870 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1e880 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53  d in Pager.pageS
1e890 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ize)..**.** If n
1e8a0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1e8b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e8c0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69  urned and the si
1e8d0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1e8e0 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69  se.** in pages i
1e8f0 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50  s stored in *pnP
1e900 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
1e910 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70  an error code (p
1e920 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45  erhaps.** SQLITE
1e930 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73  _IOERR_FSTAT) is
1e940 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1e950 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e  nPage is left un
1e960 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61  modified..*/.sta
1e970 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67  tic int pagerPag
1e980 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
1e990 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61  ager, Pgno *pnPa
1e9a0 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ge){.  Pgno nPag
1e9b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1e9c0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1e9d0 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
1e9e0 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51  nPage */..  /* Q
1e9f0 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62  uery the WAL sub
1ea00 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
1ea10 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54  database size. T
1ea20 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20  he WalDbsize(). 
1ea30 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74   ** function ret
1ea40 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65  urns zero if the
1ea50 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e   WAL is not open
1ea60 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61   (i.e. Pager.pWa
1ea70 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69  l==0), or.  ** i
1ea80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1ea90 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ize is not avail
1eaa0 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61  able. The databa
1eab0 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20  se size is not. 
1eac0 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72   ** available fr
1ead0 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1eae0 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67  ystem if the log
1eaf0 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f   file is empty o
1eb00 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  r.  ** contains 
1eb10 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74  no valid committ
1eb20 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ed transactions.
1eb30 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1eb40 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1eb50 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
1eb60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1eb70 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
1eb80 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f  CK || pPager->no
1eb90 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20 20 6e 50  Readlock );.  nP
1eba0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  age = sqlite3Wal
1ebb0 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  Dbsize(pPager->p
1ebc0 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Wal);..  /* If t
1ebd0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1ebe0 20 77 61 73 20 6e 6f 74 20 61 76 61 69 6c 61 62   was not availab
1ebf0 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20  le from the WAL 
1ec00 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a  sub-system,.  **
1ec10 20 64 65 74 65 72 6d 69 6e 65 20 69 74 20 62 61   determine it ba
1ec20 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20  sed on the size 
1ec30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ec40 66 69 6c 65 2e 20 49 66 20 74 68 65 20 73 69 7a  file. If the siz
1ec50 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61  e.  ** of the da
1ec60 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
1ec70 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
1ec80 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
1ec90 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f  ge-size,.  ** ro
1eca0 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  und down to the 
1ecb0 6e 65 61 72 65 73 74 20 70 61 67 65 2e 20 45 78  nearest page. Ex
1ecc0 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c  cept, any file l
1ecd0 61 72 67 65 72 20 74 68 61 6e 20 30 0a 20 20 2a  arger than 0.  *
1ece0 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20  * bytes in size 
1ecf0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  is considered to
1ed00 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73   contain at leas
1ed10 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f  t one page..  */
1ed20 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
1ed30 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  ){.    i64 n = 0
1ed40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ed50 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1ed60 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  db file in bytes
1ed70 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1ed80 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1ed90 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1eda0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
1edb0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1edc0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  >fd) ){.      in
1edd0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
1ede0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1edf0 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20  >fd, &n);.      
1ee00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ee10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1ee20 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1ee30 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20      }.    nPage 
1ee40 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61  = (Pgno)(n / pPa
1ee50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1ee60 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
1ee70 20 26 26 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20   && n>0 ){.     
1ee80 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20   nPage = 1;.    
1ee90 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1eea0 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
1eeb0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1eec0 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65  e file is greate
1eed0 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20  r than the.  ** 
1eee0 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d  configured maxim
1eef0 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c  um pager number,
1ef00 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   increase the al
1ef10 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20  lowed limit so. 
1ef20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c   ** that the fil
1ef30 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20  e can be read.. 
1ef40 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e   */.  if( nPage>
1ef50 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
1ef60 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
1ef70 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61  Pgno = (Pgno)nPa
1ef80 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61  ge;.  }..  *pnPa
1ef90 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
1efa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1efb0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1efc0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
1efd0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d   Check if the *-
1efe0 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f  wal file that co
1eff0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1f000 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
1f010 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78   by pPager.** ex
1f020 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74 61  ists if the data
1f030 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79  base is not empy
1f040 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61 74  , or verify that
1f050 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1f060 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73  does.** not exis
1f070 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69  t (by deleting i
1f080 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  t) if the databa
1f090 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  se file is empty
1f0a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
1f0b0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
1f0c0 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77  mpty and the *-w
1f0d0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
1f0e0 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  open the pager.*
1f0f0 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20  * in WAL mode.  
1f100 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1f110 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e  is empty or if n
1f120 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69  o *-wal file exi
1f130 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f  sts and.** if no
1f140 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d   error occurs, m
1f150 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a  ake sure Pager.j
1f160 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f  ournalMode is no
1f170 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45  t set to.** PAGE
1f180 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
1f190 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  L..**.** Return 
1f1a0 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20  SQLITE_OK or an 
1f1b0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
1f1c0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
1f1d0 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20  t hold a SHARED 
1f1e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1f1f0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c  base file to cal
1f200 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  l this.** functi
1f210 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45  on. Because an E
1f220 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1f230 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20   the db file is 
1f240 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65  required to dele
1f250 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20  te .** a WAL on 
1f260 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74  a none-empty dat
1f270 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75  abase, this ensu
1f280 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  res there is no 
1f290 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  race condition .
1f2a0 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78  ** between the x
1f2b0 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61  Access() below a
1f2c0 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20  nd an xDelete() 
1f2d0 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62  being executed b
1f2e0 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72  y some .** other
1f2f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
1f300 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1f310 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
1f320 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1f330 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1f340 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
1f350 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1f360 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
1f370 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f380 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
1f390 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  OCK || pPager->n
1f3a0 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 0a 20 20  oReadlock );..  
1f3b0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
1f3c0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
1f3d0 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20   isWal;         
1f3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1f3f0 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65  ue if WAL file e
1f400 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e  xists */.    Pgn
1f410 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
1f420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1f430 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1f440 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
1f450 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
1f460 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
1f470 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1f480 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f490 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
1f4a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1f4b0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
1f4c0 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
1f4d0 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ->zWal, 0);.    
1f4e0 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20    isWal = 0;.   
1f4f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1f500 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
1f510 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  ss(.          pP
1f520 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
1f530 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45  er->zWal, SQLITE
1f540 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
1f550 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a  &isWal.      );.
1f560 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1f570 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f580 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29       if( isWal )
1f590 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
1f5a0 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  se( sqlite3Pcach
1f5b0 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
1f5c0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
1f5d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1f5e0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
1f5f0 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  al(pPager, 0);. 
1f600 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1f610 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1f620 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
1f630 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20  LMODE_WAL ){.   
1f640 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1f650 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
1f660 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
1f670 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ETE;.      }.   
1f680 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f690 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
1f6a0 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76  .** Playback sav
1f6b0 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e  epoint pSavepoin
1f6c0 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70  t. Or, if pSavep
1f6d0 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  oint==NULL, then
1f6e0 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65   playback.** the
1f6f0 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
1f700 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
1f710 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74   case pSavepoint
1f720 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68  ==NULL occurs wh
1f730 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43  en .** a ROLLBAC
1f740 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20  K TO command is 
1f750 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56  invoked on a SAV
1f760 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61  EPOINT that is a
1f770 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
1f780 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
1f790 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e  * When pSavepoin
1f7a0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d  t is not NULL (m
1f7b0 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61  eaning a non-tra
1f7c0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
1f7d0 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20  nt is .** being 
1f7e0 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68  rolled back), th
1f7f0 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
1f800 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74  consists of up t
1f810 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a  o three stages,.
1f820 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20  ** performed in 
1f830 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66  the order specif
1f840 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ied:.**.**   * P
1f850 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20  ages are played 
1f860 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
1f870 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
1f880 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20  ing at byte.**  
1f890 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53     offset PagerS
1f8a0 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
1f8b0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
1f8c0 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  to .**     Pager
1f8d0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1f8e0 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20  fset, or to the 
1f8f0 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
1f900 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
1f910 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65  ile if PagerSave
1f920 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
1f930 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   is zero..**.** 
1f940 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65    * If PagerSave
1f950 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
1f960 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
1f970 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61  en pages are pla
1f980 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20  yed.**     back 
1f990 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68  starting from th
1f9a0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1f9b0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1f9c0 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50  lowing .**     P
1f9d0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1f9e0 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  drOffset to the 
1f9f0 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
1fa00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
1fa10 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
1fa20 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61  e then played ba
1fa30 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ck from the sub-
1fa40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74  journal file, st
1fa50 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69  arting.**     wi
1fa60 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65  th the PagerSave
1fa70 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e  point.iSubRec an
1fa80 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
1fa90 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20  the end of.**   
1faa0 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
1fab0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67  le..**.** Throug
1fac0 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63  hout the rollbac
1fad0 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20  k process, each 
1fae0 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72  time a page is r
1faf0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a  olled back, the.
1fb00 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
1fb10 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61   bit is set in a
1fb20 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
1fb30 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e  e (variable pDon
1fb40 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c  e in the.** impl
1fb50 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77  ementation below
1fb60 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ). This is used 
1fb70 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  to ensure that a
1fb80 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a   page is only.**
1fb90 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
1fba0 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69   first time it i
1fbb0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e  s encountered in
1fbc0 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e   either journal.
1fbd0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70  .**.** If pSavep
1fbe0 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  oint is NULL, th
1fbf0 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c  en pages are onl
1fc00 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  y played back fr
1fc10 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  om the main.** j
1fc20 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
1fc30 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
1fc40 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68  r a bitvec in th
1fc50 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
1fc60 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62  n either case, b
1fc70 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63  efore playback c
1fc80 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67  ommences the Pag
1fc90 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62  er.dbSize variab
1fca0 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74  le.** is reset t
1fcb0 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  o the value that
1fcc0 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20   it held at the 
1fcd0 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76  start of the sav
1fce0 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74  epoint .** (or t
1fcf0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20  ransaction). No 
1fd00 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65  page with a page
1fd10 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20  -number greater 
1fd20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a  than this value.
1fd30 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ** is played bac
1fd40 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63  k. If one is enc
1fd50 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73  ountered it is s
1fd60 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a  imply skipped..*
1fd70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1fd80 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
1fd90 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
1fda0 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  r, PagerSavepoin
1fdb0 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a  t *pSavepoint){.
1fdc0 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
1fdd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66             /* Ef
1fde0 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
1fdf0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1fe00 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
1fe10 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
1fe20 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73  * End of first s
1fe30 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a  egment of main-j
1fe40 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a  ournal records *
1fe50 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1fe60 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
1fe70 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1fe80 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d   Bitvec *pDone =
1fe90 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74   0;       /* Bit
1fea0 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61  vec to ensure pa
1feb0 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ges played back 
1fec0 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20  only once */..  
1fed0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1fee0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
1fef0 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
1ff00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
1ff10 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
1ff20 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  CKED );..  /* Al
1ff30 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20  locate a bitvec 
1ff40 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20  to use to store 
1ff50 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73  the set of pages
1ff60 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a   rolled back */.
1ff70 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
1ff80 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20   ){.    pDone = 
1ff90 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
1ffa0 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e  ate(pSavepoint->
1ffb0 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20  nOrig);.    if( 
1ffc0 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  !pDone ){.      
1ffd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1ffe0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  MEM;.    }.  }..
1fff0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74    /* Set the dat
20000 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20  abase size back 
20010 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
20020 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73  was before the s
20030 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62  avepoint .  ** b
20040 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
20050 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
20060 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
20070 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
20080 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
20090 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
200a0 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  gSize;.  pPager-
200b0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
200c0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
200d0 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61  ile;..  if( !pSa
200e0 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72  vepoint && pager
200f0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
20100 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
20110 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50  erRollbackWal(pP
20120 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
20130 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
20140 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
20150 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
20160 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
20170 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
20180 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
20190 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
201a0 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
201b0 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
201c0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
201d0 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
201e0 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
201f0 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
20200 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
20210 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
20220 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
20230 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
20240 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
20250 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
20260 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
20270 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f  | szJ==0 );..  /
20280 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
20290 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
202a0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
202b0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
202c0 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
202d0 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
202e0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
202f0 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
20300 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
20310 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
20320 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
20330 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
20340 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
20350 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
20360 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
20370 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
20380 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
20390 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
203a0 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
203b0 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
203c0 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
203d0 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
203e0 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
203f0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
20400 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61  Savepoint && !pa
20410 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
20420 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  ) ){.    iHdrOff
20430 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
20440 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
20450 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
20460 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
20470 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20480 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
20490 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
204a0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
204b0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
204c0 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
204d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
204e0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
204f0 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
20500 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20510 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
20520 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
20530 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
20540 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
20550 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20560 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
20570 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
20580 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
20590 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
205a0 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
205b0 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
205c0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
205d0 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
205e0 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
205f0 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
20600 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
20610 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
20620 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
20630 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
20640 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
20650 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
20660 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
20670 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
20680 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
20690 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
206a0 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
206b0 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
206c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
206d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
206e0 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
206f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20700 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
20710 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
20720 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
20730 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
20740 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
20750 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
20760 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
20770 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
20780 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
20790 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
207a0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
207b0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
207c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
207d0 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
207e0 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
207f0 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
20800 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
20810 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
20820 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
20830 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
20840 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
20850 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   */.    if( nJRe
20860 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
20870 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
20880 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
20890 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
208a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
208b0 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
208c0 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50   (u32)((szJ - pP
208d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
208e0 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
208f0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
20900 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
20910 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
20920 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
20930 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
20940 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
20950 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
20960 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
20970 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
20980 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
20990 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
209a0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
209b0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
209c0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
209d0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
209e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d  er->journalOff>=
209f0 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
20a00 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
20a10 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
20a20 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
20a30 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
20a40 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
20a50 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
20a60 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20a70 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
20a80 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
20a90 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
20aa0 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
20ab0 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
20ac0 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
20ad0 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
20ae0 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
20af0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
20b00 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
20b10 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53  offset = (i64)pS
20b20 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
20b30 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
20b40 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
20b50 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
20b60 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
20b70 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
20b80 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
20b90 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
20ba0 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
20bb0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
20bc0 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
20bd0 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
20be0 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
20bf0 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
20c00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20c10 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a  offset==(i64)ii*
20c20 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
20c30 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
20c40 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
20c50 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
20c60 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e  r, &offset, pDon
20c70 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 0, 1);.    }.
20c80 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
20c90 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
20ca0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
20cb0 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
20cc0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20cd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
20ce0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20cf0 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72   = szJ;.  }..  r
20d00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20d10 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
20d20 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
20d30 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
20d40 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
20d50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20d60 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
20d70 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
20d80 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
20d90 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
20da0 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
20db0 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
20dc0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ge);.}../*.** Fr
20dd0 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
20de0 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
20df0 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  om the pager..*/
20e00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
20e10 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a  erShrink(Pager *
20e20 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
20e30 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70  e3PcacheShrink(p
20e40 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
20e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
20e60 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
20e70 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
20e80 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
20e90 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
20ea0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
20eb0 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
20ec0 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
20ed0 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
20ee0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
20ef0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
20f00 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
20f10 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
20f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
20f30 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
20f40 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
20f50 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
20f60 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
20f70 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
20f80 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
20f90 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
20fa0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
20fb0 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
20fc0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
20fd0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
20fe0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
20ff0 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
21000 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
21010 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
21030 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
21040 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
21050 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
21060 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21070 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
21080 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
21090 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
210a0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
210b0 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
210c0 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
210d0 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
210e0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
21100 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
21110 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
21120 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
21130 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
21140 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
21150 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
21160 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21170 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
21180 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
21190 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
211a0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
211b0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
211c0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
211d0 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
211e0 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
211f0 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
21200 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
21210 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
21220 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
21230 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
21240 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
21250 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
21260 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
21270 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21280 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
21290 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
212a0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
212b0 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
212c0 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
212d0 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
212e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
212f0 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
21300 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
21310 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
21320 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
21330 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
21340 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
21350 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
21360 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
21370 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
21380 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
21390 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
213a0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
213b0 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
213c0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
213d0 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
213e0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
213f0 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
21400 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
21410 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
21420 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
21430 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
21440 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
21450 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
21460 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
21470 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
21480 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
21490 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
214a0 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
214b0 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
214c0 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
214d0 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
214e0 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
214f0 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
21500 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
21510 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
21520 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
21530 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
21540 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
21550 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
21560 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
21570 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
21580 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
21590 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
215a0 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
215b0 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
215c0 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
215d0 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
215e0 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
215f0 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
21600 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
21610 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
21620 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
21630 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
21640 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
21650 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
21660 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
21670 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
21680 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
21690 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
216a0 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
216b0 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
216c0 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
216d0 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
216e0 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
216f0 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
21700 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
21710 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
21720 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
21730 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
21740 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
21750 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
21760 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
21770 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
21780 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
21790 65 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67 65  etyLevel(.  Page
217a0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
217b0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
217c0 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76  o set safety lev
217d0 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  el for */.  int 
217e0 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  level,          
217f0 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63    /* PRAGMA sync
21800 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c  hronous.  1=OFF,
21810 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c   2=NORMAL, 3=FUL
21820 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46 75  L */  .  int bFu
21830 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20 2f  llFsync,       /
21840 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79  * PRAGMA fullfsy
21850 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70  nc */.  int bCkp
21860 74 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a  tFullFsync    /*
21870 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
21880 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a  nt_fullfsync */.
21890 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  ){.  assert( lev
218a0 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
218b0 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  3 );.  pPager->n
218c0 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
218d0 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
218e0 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
218f0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
21900 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
21910 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
21920 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70  e) ?1:0;.  if( p
21930 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
21940 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
21950 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  cFlags = 0;.    
21960 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
21970 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c  Flags = 0;.  }el
21980 73 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79 6e  se if( bFullFsyn
21990 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
219a0 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
219b0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
219c0 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
219d0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
219e0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
219f0 65 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46 75  else if( bCkptFu
21a00 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70  llFsync ){.    p
21a10 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
21a20 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
21a30 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
21a40 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
21a50 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
21a60 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
21a70 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
21a80 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
21a90 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
21aa0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
21ab0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
21ac0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  C_NORMAL;.  }.  
21ad0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
21ae0 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73  lags = pPager->s
21af0 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  yncFlags;.  if( 
21b00 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
21b10 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
21b20 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20  walSyncFlags |= 
21b30 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43  WAL_SYNC_TRANSAC
21b40 54 49 4f 4e 53 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  TIONS;.  }.}.#en
21b50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
21b60 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
21b70 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
21b80 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
21b90 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
21ba0 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
21bb0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
21bc0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
21bd0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
21be0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
21bf0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
21c00 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
21c10 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
21c20 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
21c30 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
21c40 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
21c50 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
21c60 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
21c70 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
21c80 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
21c90 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
21ca0 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
21cb0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
21cc0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
21cd0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
21ce0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
21cf0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
21d00 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
21d10 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
21d20 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
21d30 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
21d40 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
21d50 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
21d60 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
21d70 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
21d80 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
21d90 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
21da0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
21db0 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
21dc0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
21dd0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
21de0 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
21df0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
21e00 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
21e10 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
21e20 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
21e30 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
21e40 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
21e50 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
21e60 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
21e70 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
21e80 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
21e90 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
21ea0 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
21eb0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
21ec0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
21ed0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21ef0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
21f00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
21f10 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
21f20 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
21f30 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
21f40 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
21f50 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
21f60 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
21f70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21f80 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
21f90 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
21fa0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
21fb0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
21fc0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
21fd0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
21fe0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
21ff0 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
22000 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
22010 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
22020 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22030 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
22040 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
22050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
22060 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
22070 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
22080 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
22090 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
220a0 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
220b0 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
220c0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
220d0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
220e0 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
220f0 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
22100 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
22110 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
22120 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
22130 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
22140 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
22150 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
22160 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
22170 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
22180 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
22190 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
221a0 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
221b0 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
221c0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
221d0 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
221e0 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
221f0 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
22200 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
22210 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
22230 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
22240 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
22250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22280 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
22290 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
222a0 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
222b0 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
222c0 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
222d0 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
222e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
222f0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
22300 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
22310 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
22320 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
22330 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
22340 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
22350 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
22360 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
22370 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
22380 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
22390 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
223a0 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
223b0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
223c0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
223d0 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
223e0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
223f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22400 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
22410 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
22420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22430 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
22440 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
22450 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
22460 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
22470 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
22480 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
22490 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
224a0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
224b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
224c0 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
224d0 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
224e0 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72  */.){  .  pPager
224f0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
22500 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
22510 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
22520 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
22530 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f  HandlerArg;.}../
22540 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
22550 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
22560 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
22570 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
22580 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
22590 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
225a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
225b0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
225c0 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
225d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
225e0 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
225f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
22600 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
22610 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
22620 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
22630 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
22640 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53  LITE_IOERR, an S
22650 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20  QLITE_IOERR_xxx 
22660 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49  sub-code or SQLI
22670 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20  TE_FULL)..**.** 
22680 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c  Otherwise, if al
22690 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
226a0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
226b0 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70  **   * the new p
226c0 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20  age size (value 
226d0 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69  of *pPageSize) i
226e0 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72  s valid (a power
226f0 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20   .**     of two 
22700 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
22710 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
22720 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29  SIZE, inclusive)
22730 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
22740 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
22750 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
22760 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a  ferences, and.**
22770 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
22780 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e  base is either n
22790 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ot an in-memory 
227a0 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69  database or it i
227b0 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d  s.**     an in-m
227c0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74  emory database t
227d0 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  hat currently co
227e0 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70  nsists of zero p
227f0 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ages..**.** then
22800 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
22810 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  t page size is s
22820 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65  et to *pPageSize
22830 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
22840 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e  age size is chan
22850 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ged, then this f
22860 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c  unction uses sql
22870 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28  ite3PagerMalloc(
22880 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  ) .** to obtain 
22890 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70  a new Pager.pTmp
228a0 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66  Space buffer. If
228b0 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e   this allocation
228c0 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69   attempt .** fai
228d0 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
228e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
228f0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72   the page size r
22900 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64  emains unchanged
22910 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68  . .** In all oth
22920 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45  er cases, SQLITE
22930 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
22940 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
22950 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63  ge size is not c
22960 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62  hanged, either b
22970 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68  ecause one of th
22980 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20  e enumerated.** 
22990 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
229a0 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68   is not true, th
229b0 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
229c0 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
229d0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
229e0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20   was called, or 
229f0 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f  because the memo
22a00 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  ry allocation at
22a10 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a  tempt failed, .*
22a20 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a  * then *pPageSiz
22a30 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
22a40 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61  old, retained pa
22a50 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72  ge size before r
22a60 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
22a70 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22a80 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  Pagesize(Pager *
22a90 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61  pPager, u32 *pPa
22aa0 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
22ab0 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  erve){.  int rc 
22ac0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
22ad0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
22ae0 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75  sible to do a fu
22af0 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ll assert_pager_
22b00 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73  state() here, as
22b10 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
22b20 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
22b30 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61  d from within Pa
22b40 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72  gerOpen(), befor
22b50 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a  e the state.  **
22b60 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
22b70 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c  ject is internal
22b80 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20  ly consistent.. 
22b90 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20   **.  ** At one 
22ba0 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74  point this funct
22bb0 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20  ion returned an 
22bc0 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67  error if the pag
22bd0 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  er was in .  ** 
22be0 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
22bf0 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47  e. But since PAG
22c00 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67  ER_ERROR state g
22c10 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20  uarantees that. 
22c20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20   ** there is at 
22c30 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
22c40 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
22c50 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74  ence, this funct
22c60 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f  ion.  ** is a no
22c70 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73  -op for that cas
22c80 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a  e anyhow..  */..
22c90 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d    u32 pageSize =
22ca0 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61   *pPageSize;.  a
22cb0 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
22cc0 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
22cd0 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
22ce0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
22cf0 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28  E_SIZE) );.  if(
22d00 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d   (pPager->memDb=
22d10 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  =0 || pPager->db
22d20 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73  Size==0).   && s
22d30 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
22d40 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
22d50 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20  ache)==0 .   && 
22d60 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
22d70 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65  Size!=(u32)pPage
22d80 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29  r->pageSize .  )
22d90 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77  {.    char *pNew
22da0 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20   = NULL;        
22db0 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70       /* New temp
22dc0 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36   space */.    i6
22dd0 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20  4 nByte = 0;..  
22de0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
22df0 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20  tate>PAGER_OPEN 
22e00 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
22e10 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72  ->fd) ){.      r
22e20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
22e30 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
22e40 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  , &nByte);.    }
22e50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22e60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22e70 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
22e80 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
22e90 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
22ea0 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 63    if( !pNew ) rc
22eb0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
22ec0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
22ed0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22ee0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
22ef0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
22f00 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
22f10 20 3d 20 28 50 67 6e 6f 29 28 6e 42 79 74 65 2f   = (Pgno)(nByte/
22f20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
22f30 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
22f40 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
22f50 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
22f60 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
22f70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
22f80 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
22f90 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 73 71  = pNew;.      sq
22fa0 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61  lite3PcacheSetPa
22fb0 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  geSize(pPager->p
22fc0 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65  PCache, pageSize
22fd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
22fe0 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61  *pPageSize = pPa
22ff0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
23000 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23010 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52  OK ){.    if( nR
23020 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65  eserve<0 ) nRese
23030 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  rve = pPager->nR
23040 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
23050 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
23060 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30  && nReserve<1000
23070 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
23080 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29  nReserve = (i16)
23090 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
230a0 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
230b0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
230c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
230d0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
230e0 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
230f0 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
23100 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
23110 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
23120 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
23130 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
23140 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
23150 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
23160 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
23170 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
23180 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
23190 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
231a0 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
231b0 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
231c0 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
231d0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
231e0 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
231f0 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
23200 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
23210 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
23220 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
23230 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
23240 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
23250 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
23260 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
23270 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
23280 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
23290 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
232a0 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
232b0 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
232c0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
232d0 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
232e0 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
232f0 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
23300 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
23310 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
23320 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
23330 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
23340 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
23350 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
23360 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
23370 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
23380 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
23390 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
233a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
233b0 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
233c0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
233d0 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
233e0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
233f0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
23400 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73  xPage;.  }.  ass
23410 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
23420 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
23430 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65  );      /* Calle
23440 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78  d only by OP_Max
23450 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72  Pgcnt */.  asser
23460 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  t( pPager->mxPgn
23470 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o>=pPager->dbSiz
23480 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50  e );  /* OP_MaxP
23490 67 63 6e 74 20 65 6e 66 6f 72 63 65 73 20 74 68  gcnt enforces th
234a0 69 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  is */.  return p
234b0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
234c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
234d0 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
234e0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
234f0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
23500 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
23510 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
23520 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
23530 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
23540 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
23550 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
23560 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
23570 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
23580 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
23590 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
235a0 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
235b0 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
235c0 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
235d0 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
235e0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
235f0 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
23600 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
23610 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
23620 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
23630 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
23640 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
23650 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
23660 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
23670 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
23680 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
23690 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
236a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
236b0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
236c0 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
236d0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
236e0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
236f0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
23700 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
23710 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
23720 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
23730 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
23740 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
23750 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
23760 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
23770 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
23780 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
23790 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
237a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
237b0 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
237c0 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
237d0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
237e0 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
237f0 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
23800 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
23810 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
23820 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
23830 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
23840 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
23850 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
23860 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
23870 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
23880 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
23890 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
238a0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
238b0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
238c0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
238d0 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
238e0 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
238f0 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
23900 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
23910 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
23920 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
23930 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
23940 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
23950 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
23960 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
23970 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
23980 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
23990 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
239a0 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
239b0 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
239c0 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
239d0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
239e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
239f0 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
23a00 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
23a10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
23a20 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
23a30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
23a40 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
23a50 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
23a60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
23a70 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
23a80 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  File );..  /* Th
23a90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
23aa0 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74 72  ly called by btr
23ab0 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ee immediately a
23ac0 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20 20  fter creating.  
23ad0 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  ** the Pager obj
23ae0 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73 20  ect.  There has 
23af0 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f  not been an oppo
23b00 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e 73  rtunity to trans
23b10 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41  ition.  ** to WA
23b20 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f  L mode yet..  */
23b30 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
23b40 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
23b50 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  );..  if( isOpen
23b60 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
23b70 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
23b80 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
23b90 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
23ba0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
23bb0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
23bc0 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
23bd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23be0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
23bf0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
23c00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
23c10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
23c30 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79  unction may only
23c40 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
23c50 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
23c60 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  on is open on.**
23c70 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 72   the pager. It r
23c80 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c  eturns the total
23c90 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
23ca0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
23cb0 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ..**.** However,
23cc0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
23cd0 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
23ce0 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
23cf0 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
23d00 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
23d10 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
23d20 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
23d30 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
23d40 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
23d50 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
23d60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23d70 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
23d80 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
23d90 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
23da0 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e!=PAGER_WRITER_
23db0 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20 2a 70  FINISHED );.  *p
23dc0 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70 50 61  nPage = (int)pPa
23dd0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a  ger->dbSize;.}..
23de0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
23df0 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74  tain a lock of t
23e00 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20  ype locktype on 
23e10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23e20 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c  e. If.** a simil
23e30 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ar or greater lo
23e40 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
23e50 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
23e60 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20  n is a no-op.** 
23e70 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54  (returning SQLIT
23e80 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79  E_OK immediately
23e90 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
23ea0 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  se, attempt to o
23eb0 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75  btain the lock u
23ec0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f  sing sqlite3OsLo
23ed0 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a  ck(). Invoke .**
23ee0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
23ef0 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ck if the lock i
23f00 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
23f10 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61  available. Repea
23f20 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20  t .** until the 
23f30 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
23f40 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75  turns false or u
23f50 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74  ntil the attempt
23f60 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74   to .** obtain t
23f70 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
23f80 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
23f90 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
23fa0 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
23fb0 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
23fc0 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
23fd0 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
23fe0 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73  ck is obtained s
23ff0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74  uccessfully, set
24000 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65   the Pager.state
24010 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f   .** variable to
24020 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65   locktype before
24030 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
24040 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
24050 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
24060 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
24070 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
24080 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
240b0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
240c0 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74  that this is eit
240d0 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63  her a no-op (bec
240e0 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74  ause the request
240f0 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a  ed lock is .  **
24100 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
24110 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61  r one of the tra
24120 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74 20 74  nsistions that t
24130 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a  he busy-handler.
24140 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f    ** may be invo
24150 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f  ked during, acco
24160 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
24170 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20  ment above.  ** 
24180 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
24190 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20  usyhandler()..  
241a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  */.  assert( (pP
241b0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63  ager->eLock>=loc
241c0 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c  ktype).       ||
241d0 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
241e0 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  =NO_LOCK && lock
241f0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
24200 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  K).       || (pP
24210 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53  ager->eLock==RES
24220 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f  ERVED_LOCK && lo
24230 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
24240 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20  E_LOCK).  );..  
24250 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  do {.    rc = pa
24260 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
24270 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d  , locktype);.  }
24280 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
24290 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72  E_BUSY && pPager
242a0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70  ->xBusyHandler(p
242b0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
242c0 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 72 65 74  lerArg) );.  ret
242d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
242e0 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74   Function assert
242f0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
24300 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b  nt(pPager) check
24310 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
24320 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
24330 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20  is true for all 
24340 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72  dirty pages curr
24350 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
24360 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20  e-cache:.**.**  
24370 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d   a) The page num
24380 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
24390 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
243a0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
243b0 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61        current da
243c0 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e  tabase image, in
243d0 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a   pages, OR.**.**
243e0 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67     b) if the pag
243f0 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77  e content were w
24400 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74  ritten at this t
24410 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ime, it would no
24420 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63  t.**      be nec
24430 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
24440 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
24450 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73  ent out to the s
24460 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ub-journal.**   
24470 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65     (as determine
24480 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75  d by function su
24490 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
244a0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
244b0 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74  condition assert
244c0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
244d0 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
244e0 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69  e, and the.** di
244f0 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f  rty page were to
24500 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72   be discarded fr
24510 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61  om the cache via
24520 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73   the pagerStress
24530 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70  ().** routine, p
24540 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75  agerStress() wou
24550 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  ld not write the
24560 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
24570 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ntent to.** the 
24580 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
24590 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  f a savepoint tr
245a0 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72  ansaction were r
245b0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72  olled back after
245c0 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65  .** this happene
245d0 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  d, the correct b
245e0 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62  ehaviour would b
245f0 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  e to restore the
24600 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74   current.** cont
24610 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
24620 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   However, since 
24630 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20  this content is 
24640 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65  not present in e
24650 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74  ither.** the dat
24660 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68  abase file or th
24670 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  e portion of the
24680 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
24690 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f  l and .** sub-jo
246a0 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63  urnal rolled bac
246b0 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f  k the content co
246c0 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f  uld not be resto
246d0 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  red and the.** d
246e0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f  atabase image wo
246f0 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
24700 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66  pt. It is theref
24710 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68  ore fortunate th
24720 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63  at .** this circ
24730 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20  umstance cannot 
24740 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65  arise..*/.#if de
24750 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
24760 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  UG).static void 
24770 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
24780 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72  nstraintCb(PgHdr
24790 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
247a0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
247b0 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73  DR_DIRTY );.  as
247c0 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69  sert( !subjRequi
247d0 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20  resPage(pPg) || 
247e0 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e  pPg->pgno<=pPg->
247f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
24800 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
24810 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
24820 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a  nstraint(Pager *
24830 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
24840 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
24850 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
24860 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e  ache, assertTrun
24870 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
24880 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
24890 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  ine assertTrunca
248a0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
248b0 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ger).#endif../*.
248c0 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
248d0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
248e0 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f  se file image to
248f0 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68   nPage pages. Th
24900 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
24910 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  does not actuall
24920 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74  y modify the dat
24930 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
24940 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20  sk. It .** just 
24950 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61  sets the interna
24960 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  l state of the p
24970 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74  ager object so t
24980 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e  hat the .** trun
24990 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64  cation will be d
249a0 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  one when the cur
249b0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
249c0 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
249d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
249e0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
249f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24a00 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61  Pgno nPage){.  a
24a10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
24a20 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
24a30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24a40 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
24a50 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
24a60 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
24a70 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61  ize = nPage;.  a
24a80 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
24a90 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b  straint(pPager);
24aa0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
24ab0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
24ac0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
24ad0 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
24ae0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
24af0 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
24b00 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
24b10 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
24b20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
24b30 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
24b40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
24b50 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
24b60 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
24b70 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
24b80 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
24b90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
24ba0 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
24bb0 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
24bc0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
24bd0 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
24be0 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
24bf0 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
24c00 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
24c10 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
24c20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
24c30 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
24c40 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
24c50 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
24c60 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
24c70 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
24c80 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
24c90 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
24ca0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
24cb0 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
24cc0 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
24cd0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
24ce0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
24cf0 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
24d00 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
24d10 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
24d20 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
24d30 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
24d40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24d50 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
24d60 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
24d70 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
24d80 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
24d90 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
24da0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
24db0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24dc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
24dd0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
24de0 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
24df0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
24e00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24e10 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
24e20 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
24e30 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
24e40 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
24e50 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
24e60 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
24e70 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
24e80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
24e90 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
24ea0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
24eb0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
24ec0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
24ed0 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
24ee0 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
24ef0 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
24f00 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
24f10 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
24f20 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
24f30 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
24f40 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
24f50 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
24f60 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
24f70 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
24f80 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
24f90 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
24fa0 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
24fb0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
24fc0 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
24fd0 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
24fe0 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
24ff0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
25000 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
25010 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
25020 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
25030 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
25040 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
25050 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
25060 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
25070 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
25080 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
25090 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
250a0 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
250b0 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72  pSpace;..  asser
250c0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
250d0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
250e0 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
250f0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
25100 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
25110 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
25120 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
25130 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Code = 0; */.  p
25140 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
25150 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Mode = 0;.#ifnde
25160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
25170 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c  L.  sqlite3WalCl
25180 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ose(pPager->pWal
25190 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79  , pPager->ckptSy
251a0 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d  ncFlags, pPager-
251b0 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 29  >pageSize, pTmp)
251c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  ;.  pPager->pWal
251d0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
251e0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
251f0 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  r);.  if( MEMDB 
25200 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  ){.    pager_unl
25210 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
25220 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
25230 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63  it is open, sync
25240 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25250 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
25260 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61   UnlockAndRollba
25270 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  ck..    ** If th
25280 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20  is is not done, 
25290 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64  then an unsynced
252a0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
252b0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  open journal .  
252c0 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65    ** file may be
252d0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
252e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
252f0 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
25300 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a  re occurs .    *
25310 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20  * while this is 
25320 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64  happening, the d
25330 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
25340 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20  come corrupt..  
25350 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61    **.    ** If a
25360 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
25370 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
25380 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  ync the journal,
25390 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65 72   shift the pager
253a0 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
253b0 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68   ERROR state. Th
253c0 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b  is causes Unlock
253d0 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75  AndRollback to u
253e0 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a  nlock the.    **
253f0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
25400 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
25410 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74  file without att
25420 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
25430 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f  it.    ** back o
25440 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54  r finalize it. T
25450 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73 65  he next database
25460 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20   user will have 
25470 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  to do hot-journa
25480 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  l.    ** rollbac
25490 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73 69  k before accessi
254a0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
254b0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
254c0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
254d0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
254e0 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
254f0 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48  ager, pagerSyncH
25500 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
25510 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
25520 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
25530 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
25540 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  }.  sqlite3EndBe
25550 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
25560 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
25570 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
25580 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f  PAGERTRACE(("CLO
25590 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
255a0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49  D(pPager)));.  I
255b0 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
255c0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
255d0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
255e0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
255f0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
25600 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71  Pager->fd);.  sq
25610 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54  lite3PageFree(pT
25620 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  mp);.  sqlite3Pc
25630 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
25640 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66  ->pPCache);..#if
25650 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
25660 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65  ODEC.  if( pPage
25670 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20  r->xCodecFree ) 
25680 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
25690 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ee(pPager->pCode
256a0 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  c);.#endif..  as
256b0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61  sert( !pPager->a
256c0 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50  Savepoint && !pP
256d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
256e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69   );.  assert( !i
256f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
25700 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
25710 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a  ager->sjfd) );..
25720 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
25730 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
25740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
25750 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
25760 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
25770 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
25780 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
25790 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67  e number for pag
257a0 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73  e pPg..*/.Pgno s
257b0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
257c0 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50  umber(DbPage *pP
257d0 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
257e0 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
257f0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
25800 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
25810 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70  count for page p
25820 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Pg..*/.void sqli
25830 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
25840 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69  ge *pPg){.  sqli
25850 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67  te3PcacheRef(pPg
25860 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  );.}../*.** Sync
25870 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e   the journal. In
25880 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
25890 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
258a0 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
258b0 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
258c0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
258d0 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
258e0 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
258f0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   of the.** disk 
25900 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f  and can be resto
25910 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
25920 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
25930 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  l rollback..**.*
25940 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
25950 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  oSync flag is se
25960 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
25970 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
25980 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
25990 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75  the actions requ
259a0 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74  ired depend on t
259b0 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
259c0 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69  and the .** devi
259d0 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
259e0 63 73 20 6f 66 20 74 68 65 20 74 68 65 20 66 69  cs of the the fi
259f0 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f  le-system, as fo
25a00 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  llows:.**.**   *
25a10 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
25a20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65  file is an in-me
25a30 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
25a40 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65  e, no action nee
25a50 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65  d.**     be take
25a60 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68  n..**.**   * Oth
25a70 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64  erwise, if the d
25a80 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
25a90 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f  upport the SAFE_
25aa0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c  APPEND property,
25ab0 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65  .**     then the
25ac0 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74   nRec field of t
25ad0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
25ae0 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c   written journal
25af0 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69   header.**     i
25b00 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
25b10 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
25b20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  of journal recor
25b30 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  ds that have.** 
25b40 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e      been written
25b50 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49   following it. I
25b60 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
25b70 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c  perating in full
25b80 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64  -sync.**     mod
25b90 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
25ba0 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
25bb0 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  ed before this f
25bc0 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e  ield is updated.
25bd0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
25be0 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
25bf0 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45  t support the SE
25c00 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74  QUENTIAL propert
25c10 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20  y, then .**     
25c20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
25c30 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72  synced..**.** Or
25c40 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65  , in pseudo-code
25c50 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f  :.**.**   if( NO
25c60 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  T <in-memory jou
25c70 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20  rnal> ){.**     
25c80 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50  if( NOT SAFE_APP
25c90 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  END ){.**       
25ca0 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d  if( <full-sync m
25cb0 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f  ode> ) xSync(<jo
25cc0 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
25cd0 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e         <update n
25ce0 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20  Rec field>.**   
25cf0 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20    } .**     if( 
25d00 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29  NOT SEQUENTIAL )
25d10 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
25d20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a  file>);.**   }.*
25d30 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
25d40 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ul, this routine
25d50 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44   clears the PGHD
25d60 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
25d70 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61   of every .** pa
25d80 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ge currently hel
25d90 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f  d in memory befo
25da0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
25db0 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
25dc0 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63  .** error is enc
25dd0 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74  ountered, then t
25de0 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
25df0 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
25e00 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
25e10 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
25e20 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
25e30 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29  ger, int newHdr)
25e40 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e60 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
25e70 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
25e80 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
25e90 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
25ea0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
25eb0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
25ec0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
25ed0 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
25ee0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
25ef0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
25f00 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
25f10 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
25f20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
25f30 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
25f40 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
25f50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25f60 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
25f70 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
25f80 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  oSync ){.    ass
25f90 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
25fa0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
25fb0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
25fc0 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
25fd0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
25fe0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
25ff0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
26000 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20  const int iDc = 
26010 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
26020 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
26030 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
26040 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
26050 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
26060 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
26070 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
26080 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
26090 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
260a0 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74   block deals wit
260b0 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f  h an obscure pro
260c0 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73  blem. If the las
260d0 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  t connection.   
260e0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f       ** that wro
260f0 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  te to this datab
26100 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e  ase was operatin
26110 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d  g in persistent-
26120 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
26130 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  ** mode, then th
26140 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
26150 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ay at this point
26160 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72   actually be lar
26170 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ger.        ** t
26180 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  han Pager.journa
26190 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74  lOff bytes. If t
261a0 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e  he next thing in
261b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
261c0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70       ** file hap
261d0 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75  pens to be a jou
261e0 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69  rnal-header (wri
261f0 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  tten as part of 
26200 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
26210 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69  revious connecti
26220 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  on's transaction
26230 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f  ), and a crash o
26240 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  r power-failure 
26250 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  .        ** occu
26260 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73  rs after nRec is
26270 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66   updated but bef
26280 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ore this connect
26290 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20  ion writes .    
262a0 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20      ** anything 
262b0 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  else to the jour
262c0 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d  nal file (or com
262d0 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20  mits/rolls back 
262e0 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  its .        ** 
262f0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68  transaction), th
26300 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65  en SQLite may be
26310 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68  come confused wh
26320 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20  en doing the .  
26330 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
26340 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  rnal rollback fo
26350 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
26360 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61  . It may roll ba
26370 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  ck all.        *
26380 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  * of this connec
26390 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e  tions data, then
263a0 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c   proceed to roll
263b0 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64  ing back the old
263c0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  ,.        ** out
263d0 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68  -of-date data th
263e0 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44  at follows it. D
263f0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
26400 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
26410 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72         ** To wor
26420 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69  k around this, i
26430 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
26440 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74  le does appear t
26450 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  o contain.      
26460 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61    ** a valid hea
26470 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61  der following Pa
26480 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  ger.journalOff, 
26490 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30  then write a 0x0
264a0 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  0.        ** byt
264b0 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  e to the start o
264c0 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20  f it to prevent 
264d0 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  it from being re
264e0 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20  cognized..      
264f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
26500 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64  Variable iNextHd
26510 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
26520 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20  o the offset at 
26530 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20  which this.     
26540 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69     ** problemati
26550 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63  c header will oc
26560 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74  cur, if it exist
26570 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65  s. aMagic is use
26580 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  d .        ** as
26590 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
265a0 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74  fer to inspect t
265b0 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20  he first couple 
265c0 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20  of bytes of.    
265d0 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e      ** the poten
265e0 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tial journal hea
265f0 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  der..        */.
26600 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78          i64 iNex
26610 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  tHdrOffset;.    
26620 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d      u8 aMagic[8]
26630 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65  ;.        u8 zHe
26640 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
26650 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a  rnalMagic)+4];..
26660 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
26670 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
26680 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
26690 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
266a0 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
266b0 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
266c0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
266d0 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
266e0 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48  ..        iNextH
266f0 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e  drOffset = journ
26700 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
26710 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
26720 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
26730 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
26740 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72  gic, 8, iNextHdr
26750 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
26760 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26770 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  OK && 0==memcmp(
26780 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
26790 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20  Magic, 8) ){.   
267a0 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
267b0 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20  nst u8 zerobyte 
267c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
267d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
267e0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
267f0 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e  &zerobyte, 1, iN
26800 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
26810 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26820 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26830 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
26840 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
26850 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
26860 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26870 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
26880 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
26890 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
268a0 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
268b0 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
268c0 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
268d0 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
268e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
268f0 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
26900 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
26910 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
26920 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
26930 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
26940 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
26950 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
26960 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
26970 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20   rollback..     
26980 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
26990 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
269a0 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72  uired if the per
269b0 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75  sistent media su
269c0 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20  pports the.     
269d0 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e     ** SAFE_APPEN
269e0 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61  D property. Beca
269f0 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  use in this case
26a00 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
26a10 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble .        ** 
26a20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61  for garbage data
26a30 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
26a40 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65  to the file, the
26a50 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20   nRec field.    
26a60 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61      ** is popula
26a70 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46  ted with 0xFFFFF
26a80 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  FFF when the jou
26a90 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77  rnal header is w
26aa0 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a  ritten.        *
26ab0 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64  * and never need
26ac0 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  s to be updated.
26ad0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26ae0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
26af0 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
26b00 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
26b10 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
26b20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
26b30 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
26b40 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
26b50 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
26b60 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
26b70 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
26b80 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
26b90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26ba0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
26bb0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
26bc0 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  cFlags);.       
26bd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26be0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
26bf0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26c00 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
26c10 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70  DR %p %lld\n", p
26c20 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
26c30 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20  ournalHdr));.   
26c40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26c50 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20  3OsWrite(.      
26c60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66        pPager->jf
26c70 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65  d, zHeader, size
26c80 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61  of(zHeader), pPa
26c90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  ger->journalHdr.
26ca0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
26cb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26cc0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
26cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26ce0 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
26cf0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
26d00 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
26d10 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
26d20 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
26d30 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
26d40 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49  er)));.        I
26d50 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
26d60 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
26d70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26d80 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
26d90 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
26da0 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20  yncFlags| .     
26db0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
26dc0 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ncFlags==SQLITE_
26dd0 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
26de0 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
26df0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
26e00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26e10 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
26e20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
26e30 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
26e40 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
26e50 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
26e60 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20    if( newHdr && 
26e70 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
26e80 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
26e90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  ) ){.        pPa
26ea0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
26eb0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
26ec0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
26ed0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
26ee0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26ef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26f00 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
26f10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
26f20 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
26f30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
26f40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e    }.  }..  /* Un
26f50 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
26f60 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65  s in noSync mode
26f70 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
26f80 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a  le was just .  *
26f90 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73  * successfully s
26fa0 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61  ynced. Either wa
26fb0 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  y, clear the PGH
26fc0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
26fd0 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70  g on .  ** all p
26fe0 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ages..  */.  sql
26ff0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
27000 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
27010 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61  >pPCache);.  pPa
27020 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
27030 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
27040 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
27050 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
27060 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
27070 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
27080 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
27090 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
270a0 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   in a linked lis
270b0 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
270c0 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79   connected.** by
270d0 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
270e0 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20  y pointer. This 
270f0 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20  function writes 
27100 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a  each one of the.
27110 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ** in-memory pag
27120 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74  es in the list t
27130 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
27140 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ile. The argumen
27150 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c  t may.** be NULL
27160 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61  , representing a
27170 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e  n empty list. In
27180 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
27190 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61  function is.** a
271a0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
271b0 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c  e pager must hol
271c0 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  d at least a RES
271d0 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20  ERVED lock when 
271e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
271f0 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f   is called. Befo
27200 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68  re writing anyth
27210 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
27220 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c  ase file, this l
27230 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64  ock.** is upgrad
27240 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ed to an EXCLUSI
27250 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  VE lock. If the 
27260 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
27270 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49  btained,.** SQLI
27280 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
27290 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20  ned and no data 
272a0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
272b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
272c0 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70  .** .** If the p
272d0 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66  ager is a temp-f
272e0 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68  ile pager and th
272f0 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79  e actual file-sy
27300 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20  stem file.** is 
27310 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74  not yet open, it
27320 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
27330 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e  opened before an
27340 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72  y data is .** wr
27350 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a  itten out..**.**
27360 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68   Once the lock h
27370 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64  as been upgraded
27380 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61   and, if necessa
27390 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65  ry, the file ope
273a0 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ned,.** the page
273b0 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75  s are written ou
273c0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
273d0 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f  e file in list o
273e0 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a  rder. Writing.**
273f0 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70   a page is skipp
27400 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65  ed if it meets e
27410 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c  ither of the fol
27420 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a  lowing criteria:
27430 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
27440 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72  age number is gr
27450 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72  eater than Pager
27460 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20  .dbSize, or.**  
27470 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e   * The PGHDR_DON
27480 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20  T_WRITE flag is 
27490 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  set on the page.
274a0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e  .**.** If writin
274b0 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75  g out a page cau
274c0 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
274d0 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50   file to grow, P
274e0 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a  ager.dbFileSize.
274f0 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63  ** is updated ac
27500 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61  cordingly. If pa
27510 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20  ge 1 is written 
27520 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  out, then the va
27530 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e  lue cached.** in
27540 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
27550 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74  s[] is updated t
27560 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  o match the new 
27570 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
27580 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
27590 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
275a0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
275b0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
275c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
275d0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
275e0 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f  ** occurs, an IO
275f0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
27600 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
27610 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
27620 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20  ck cannot.** be 
27630 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45  obtained, SQLITE
27640 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
27650 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
27660 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
27670 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61  elist(Pager *pPa
27680 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73  ger, PgHdr *pLis
27690 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
276a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
276b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
276c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
276d0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
276e0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
276f0 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  for rollback pag
27700 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42  ers in WRITER_DB
27710 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  MOD state. */.  
27720 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
27730 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
27740 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27750 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
27760 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a  WRITER_DBMOD );.
27770 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27780 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
27790 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
277a0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
277b0 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20  a temp-file has 
277c0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
277d0 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
277e0 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  . It.  ** is not
277f0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63   possible for rc
27800 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61   to be other tha
27810 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
27820 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20  his branch.  ** 
27830 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67  is taken, as pag
27840 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
27850 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
27860 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a   temp-files..  *
27870 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
27880 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
27890 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
278a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72  r->tempFile && r
278b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
278c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
278d0 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
278e0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
278f0 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
27900 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74  }..  /* Before t
27910 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20  he first write, 
27920 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68  give the VFS a h
27930 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20  int of what the 
27940 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  final.  ** file 
27950 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20  size will be..  
27960 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  */.  assert( rc!
27970 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
27980 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
27990 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
279a0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
279b0 72 2d 3e 64 62 53 69 7a 65 3e 70 50 61 67 65 72  r->dbSize>pPager
279c0 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 7b 0a  ->dbHintSize ){.
279d0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
279e0 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65  4 szFile = pPage
279f0 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73  r->pageSize * (s
27a00 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61  qlite3_int64)pPa
27a10 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
27a20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
27a30 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
27a40 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  , SQLITE_FCNTL_S
27a50 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c  IZE_HINT, &szFil
27a60 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
27a70 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61  dbHintSize = pPa
27a80 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
27a90 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
27aa0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
27ab0 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
27ac0 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  no = pList->pgno
27ad0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
27ae0 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
27af0 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
27b00 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
27b10 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
27b20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
27b30 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
27b40 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
27b50 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
27b60 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
27b70 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
27b80 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
27b90 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
27ba0 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
27bb0 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
27bc0 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
27bd0 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
27be0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c   **.    ** Also,
27bf0 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75   do not write ou
27c00 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  t any page that 
27c10 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f  has the PGHDR_DO
27c20 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20  NT_WRITE flag.  
27c30 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79    ** set (set by
27c40 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
27c50 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a  tWrite())..    *
27c60 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
27c70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
27c80 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
27c90 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
27ca0 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
27cb0 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
27cc0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
27cd0 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
27ce0 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
27cf0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
27d00 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
27d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
27d30 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
27d40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
27d50 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
27d60 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30  DR_NEED_SYNC)==0
27d70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
27d80 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
27d90 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
27da0 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
27db0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64  ..      /* Encod
27dc0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  e the database *
27dd0 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  /.      CODEC2(p
27de0 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44  Pager, pList->pD
27df0 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65  ata, pgno, 6, re
27e00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
27e10 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  M, pData);..    
27e20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74    /* Write out t
27e30 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f  he page data. */
27e40 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
27e50 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
27e60 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50  r->fd, pData, pP
27e70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
27e80 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20  offset);..      
27e90 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73  /* If page 1 was
27ea0 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75   just written, u
27eb0 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69  pdate Pager.dbFi
27ec0 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a  leVers to match.
27ed0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
27ee0 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e  ue now stored in
27ef0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27f00 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74  le. If writing t
27f10 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61  his .      ** pa
27f20 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61  ge caused the da
27f30 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
27f40 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69  row, update dbFi
27f50 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a  leSize. .      *
27f60 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  /.      if( pgno
27f70 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==1 ){.        m
27f80 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
27f90 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74  bFileVers, &pDat
27fa0 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50  a[24], sizeof(pP
27fb0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
27fc0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
27fd0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
27fe0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
27ff0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
28000 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
28010 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  no;.      }..   
28020 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79     /* Update any
28030 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20   backup objects 
28040 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  copying the cont
28050 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
28060 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  er. */.      sql
28070 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
28080 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
28090 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69  , pgno, (u8*)pLi
280a0 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20  st->pData);..   
280b0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
280c0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
280d0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
280e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280f0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
28100 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
28110 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
28120 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
28130 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
28140 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
28150 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
28160 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
28170 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
28180 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
28190 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
281a0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
281b0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
281c0 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
281d0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
281e0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29  (pPager), pgno))
281f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
28200 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
28210 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74  List);.    pList
28220 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
28230 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
28240 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73  rc;.}../*.** Ens
28250 75 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62  ure that the sub
28260 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
28270 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20   open. If it is 
28280 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
28290 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
282a0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
282b0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
282c0 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
282d0 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72  thing goes accor
282e0 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e  ding to plan. An
282f0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
28300 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
28310 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
28320 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
28330 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61  3OsOpen() .** fa
28340 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
28350 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
28360 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
28370 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
28380 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69  ITE_OK;.  if( !i
28390 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
283a0 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  fd) ){.    if( p
283b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
283c0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
283d0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20  LMODE_MEMORY || 
283e0 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
283f0 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71  mory ){.      sq
28400 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
28410 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
28420 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
28430 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
28440 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
28450 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c  Pager->sjfd, SQL
28460 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
28470 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NAL);.    }.  }.
28480 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28490 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
284a0 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72  ecord of the cur
284b0 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61  rent state of pa
284c0 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75  ge pPg to the su
284d0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49  b-journal. .** I
284e0 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
284f0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
28500 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69  to use subjRequi
28510 72 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65  resPage() to che
28520 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ck .** that it i
28530 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  s really require
28540 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
28550 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
28560 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
28570 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74  ful, set the bit
28580 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
28590 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74  o pPg->pgno in t
285a0 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f  he bitvecs.** fo
285b0 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  r all open savep
285c0 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74  oints before ret
285d0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  urning..**.** Th
285e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
285f0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  rns SQLITE_OK if
28600 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
28610 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f  uccessful, an IO
28620 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
28630 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
28640 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75   write to the su
28650 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  b-journal fails,
28660 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   or .** SQLITE_N
28670 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
28680 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74   fails while set
28690 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20  ting a bit in a 
286a0 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74  savepoint.** bit
286b0 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vec..*/.static i
286c0 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  nt subjournalPag
286d0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
286e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
286f0 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
28700 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
28710 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  er;.  if( pPager
28720 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
28730 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
28740 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  _OFF ){..    /* 
28750 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  Open the sub-jou
28760 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20  rnal, if it has 
28770 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
28780 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61   opened */.    a
28790 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
287a0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
287b0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
287c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
287d0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
287e0 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  er) );.    asser
287f0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
28800 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  ->sjfd) || pPage
28810 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b  r->nSubRec==0 );
28820 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
28830 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
28840 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61   .         || pa
28850 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
28860 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50   .         || pP
28870 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
28880 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20  dbOrigSize .    
28890 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  );.    rc = open
288a0 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  SubJournal(pPage
288b0 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  r);..    /* If t
288c0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77  he sub-journal w
288d0 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73  as opened succes
288e0 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61  sfully (or was a
288f0 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20  lready open),.  
28900 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a    ** write the j
28910 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e  ournal record in
28920 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f  to the file.  */
28930 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
28940 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28950 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
28960 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20  g->pData;.      
28970 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36  i64 offset = (i6
28980 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  4)pPager->nSubRe
28990 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
289a0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68  eSize);.      ch
289b0 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20  ar *pData2;.  . 
289c0 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
289d0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
289e0 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
289f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
28a00 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47  ata2);.      PAG
28a10 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a  ERTRACE(("STMT-J
28a20 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
28a30 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
28a40 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
28a50 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
28a60 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
28a70 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c  r->sjfd, offset,
28a80 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
28a90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28aa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
28ac0 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ite(pPager->sjfd
28ad0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
28ae0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
28af0 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20  et+4);.      }. 
28b00 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
28b10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28b20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
28b30 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Rec++;.    asser
28b40 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
28b50 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72  point>0 );.    r
28b60 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69  c = addToSavepoi
28b70 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
28b80 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
28b90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
28ba0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
28bb0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
28bc0 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61  by the pcache la
28bd0 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20  yer when it has 
28be0 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20  reached some.** 
28bf0 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69  soft memory limi
28c00 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
28c10 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
28c20 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62  er to a Pager ob
28c30 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73  ject.** (cast as
28c40 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70   a void*). The p
28c50 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27  ager is always '
28c60 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20  purgeable' (not 
28c70 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
28c80 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73  database). The s
28c90 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
28ca0 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
28cb0 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20   a page that is 
28cc0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69  .** currently di
28cd0 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f  rty but has no o
28ce0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
28cf0 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a  ences. The page.
28d00 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73  ** is always ass
28d10 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
28d20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   Pager object pa
28d30 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
28d40 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  t .** argument..
28d50 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
28d60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
28d70 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c  s to make pPg cl
28d80 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69  ean by writing i
28d90 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  ts contents.** o
28da0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
28db0 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73  se file, if poss
28dc0 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69  ible. This may i
28dd0 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74  nvolve syncing t
28de0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
28df0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  le. .**.** If su
28e00 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65  ccessful, sqlite
28e10 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
28e20 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
28e30 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  the page and.** 
28e40 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
28e50 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
28e60 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
28e70 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74  trying to make t
28e80 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e  he.** page clean
28e90 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
28ea0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
28eb0 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e   If the page can
28ec0 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63  not be.** made c
28ed0 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74  lean for some ot
28ee0 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20  her reason, but 
28ef0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
28f00 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a   then SQLITE_OK.
28f10 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  ** is returned b
28f20 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  y sqlite3PcacheM
28f30 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f  akeClean() is no
28f40 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  t called..*/.sta
28f50 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
28f60 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48  ess(void *p, PgH
28f70 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
28f80 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
28f90 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63  er *)p;.  int rc
28fa0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
28fb0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
28fc0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
28fd0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
28fe0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
28ff0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f   );..  /* The do
29000 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61  NotSyncSpill fla
29010 67 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20  g is set during 
29020 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67  times when doing
29030 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20   a sync of.  ** 
29040 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64  journal (and add
29050 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65 72  ing a new header
29060 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  ) is not allowed
29070 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20  .  This occurs. 
29080 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73   ** during calls
29090 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
290a0 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74 72  Write() while tr
290b0 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  ying to journal 
290c0 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61  multiple.  ** pa
290d0 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ges belonging to
290e0 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
290f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
29100 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 20  doNotSpill flag 
29110 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63  inhibits all cac
29120 68 65 20 73 70 69 6c 6c 69 6e 67 20 72 65 67 61  he spilling rega
29130 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
29140 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 61 20  r.  ** or not a 
29150 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
29160 2e 20 20 54 68 69 73 20 69 73 20 73 65 74 20 64  .  This is set d
29170 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
29180 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c  ..  **.  ** Spil
29190 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f  ling is also pro
291a0 68 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20  hibited when in 
291b0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73  an error state s
291c0 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a  ince that could.
291d0 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74    ** lead to dat
291e0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
291f0 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65  .   In the curre
29200 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e  nt implementaton
29210 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70   it .  ** is imp
29220 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69  ossible for sqli
29230 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
29240 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69   to be called wi
29250 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 31  th createFlag==1
29260 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74  .  ** while in t
29270 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
29280 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f  hence it is impo
29290 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
292a0 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20  routine to.  ** 
292b0 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  be called in the
292c0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e   error state.  N
292d0 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20  evertheless, we 
292e0 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28  include a NEVER(
292f0 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20  ).  ** test for 
29300 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
29310 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61  as a safeguard a
29320 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68  gainst future ch
29330 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  anges..  */.  if
29340 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
29350 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
29360 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
29370 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  f( pPager->doNot
29380 53 70 69 6c 6c 20 29 20 72 65 74 75 72 6e 20 53  Spill ) return S
29390 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
293a0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
293b0 63 53 70 69 6c 6c 20 26 26 20 28 70 50 67 2d 3e  cSpill && (pPg->
293c0 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
293d0 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 7b 0a 20  ED_SYNC)!=0 ){. 
293e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
293f0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d  _OK;.  }..  pPg-
29400 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69  >pDirty = 0;.  i
29410 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
29420 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  Pager) ){.    /*
29430 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   Write a single 
29440 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70  frame for this p
29450 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20  age to the log. 
29460 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52  */.    if( subjR
29470 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
29480 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20 3d 20   ){ .      rc = 
29490 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
294a0 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  Pg); .    }.    
294b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
294c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
294d0 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70  pagerWalFrames(p
294e0 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30  Pager, pPg, 0, 0
294f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
29500 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63  {.  .    /* Sync
29510 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29520 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  e if required. *
29530 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66  /.    if( pPg->f
29540 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
29550 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50  SYNC .     || pP
29560 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
29570 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
29580 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  MOD.    ){.     
29590 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
295a0 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  l(pPager, 1);.  
295b0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
295c0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
295d0 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73   of this page is
295e0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
295f0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
29600 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
29610 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d  base image, it m
29620 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72  ay need to be wr
29630 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62  itten to the sub
29640 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a  -journal..    **
29650 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
29660 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67   the call to pag
29670 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
29680 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  t() below will n
29690 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  ot.    ** actual
296a0 6c 79 20 77 72 69 74 65 20 64 61 74 61 20 74 6f  ly write data to
296b0 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69   the file in thi
296c0 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20  s case..    **. 
296d0 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74     ** Consider t
296e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71  he following seq
296f0 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a  uence of events:
29700 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
29710 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20   BEGIN;.    **  
29720 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
29730 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c   X>.    **     <
29740 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20  modify page X>. 
29750 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f     **     SAVEPO
29760 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20  INT sp;.    **  
29770 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74       <shrink dat
29780 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20  abase file to Y 
29790 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20  pages>.    **   
297a0 20 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28      pagerStress(
297b0 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a 20 20  page X).    **  
297c0 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73     ROLLBACK TO s
297d0 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  p;.    **.    **
297e0 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20   If (X>Y), then 
297f0 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 73  when pagerStress
29800 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20   is called page 
29810 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72  X will not be wr
29820 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74  itten.    ** out
29830 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
29840 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20   file, but will 
29850 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  be dropped from 
29860 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c  the cache. Then,
29870 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
29880 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  g the "ROLLBACK 
29890 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74  TO sp" statement
298a0 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58  , reading page X
298b0 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a   will read.    *
298c0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
298d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
298e0 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
298f0 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20 61  copy of page X a
29900 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61 73 20  s it.    ** was 
29910 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
29920 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f  tion started, no
29930 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
29940 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a   "SAVEPOINT sp".
29950 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75      ** was execu
29960 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
29970 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
29980 69 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  is to write the 
29990 63 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72  current data for
299a0 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65   page X into the
299b0 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75   .    ** sub-jou
299c0 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69  rnal file now (i
299d0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
299e0 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74  ady there), so t
299f0 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 20 20  hat it will.    
29a00 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ** be restored t
29a10 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  o its current va
29a20 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f  lue when the "RO
29a30 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73  LLBACK TO sp" is
29a40 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75 74 65   .    ** execute
29a50 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
29a60 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20 20  ( NEVER(.       
29a70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29a80 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  & pPg->pgno>pPag
29a90 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75  er->dbSize && su
29aa0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
29ab0 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20 20 20  Pg).    ) ){.   
29ac0 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
29ad0 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  alPage(pPg);.   
29ae0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69   }.  .    /* Wri
29af0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
29b00 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  of the page out 
29b10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
29b20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
29b30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29b40 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
29b50 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
29b60 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20  R_NEED_SYNC)==0 
29b70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
29b80 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
29b90 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  st(pPager, pPg);
29ba0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
29bb0 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
29bc0 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66  s clean. */.  if
29bd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29be0 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
29bf0 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61  E(("STRESS %d pa
29c00 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
29c10 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
29c20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  pgno));.    sqli
29c30 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
29c40 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  an(pPg);.  }..  
29c50 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
29c60 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20  or(pPager, rc); 
29c70 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
29c80 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
29c90 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
29ca0 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
29cb0 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
29cc0 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
29cd0 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
29ce0 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
29cf0 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
29d00 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
29d10 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
29d20 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
29d30 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
29d40 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
29d50 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
29d60 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
29d70 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
29d80 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
29d90 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
29da0 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
29db0 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
29dc0 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
29dd0 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
29de0 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
29df0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
29e00 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
29e10 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
29e20 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
29e30 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
29e40 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
29e50 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
29e60 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
29e70 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
29e80 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
29e90 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
29ea0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
29eb0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
29ec0 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
29ed0 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
29ee0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
29ef0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
29f00 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
29f10 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
29f20 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
29f30 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
29f40 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
29f50 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
29f60 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a  Extra() API..**.
29f70 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67  ** The flags arg
29f80 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ument is used to
29f90 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74   specify propert
29fa0 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20  ies that affect 
29fb0 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  the.** operation
29fc0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49   of the pager. I
29fd0 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  t should be pass
29fe0 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20  ed some bitwise 
29ff0 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  combination.** o
2a000 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54  f the PAGER_OMIT
2a010 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47  _JOURNAL and PAG
2a020 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66  ER_NO_READLOCK f
2a030 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
2a040 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
2a050 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
2a060 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
2a070 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
2a080 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
2a090 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
2a0a0 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
2a0b0 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
2a0c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
2a0d0 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
2a0e0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
2a0f0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
2a100 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
2a110 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
2a120 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
2a130 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
2a140 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
2a150 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
2a160 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
2a170 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
2a180 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
2a190 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
2a1a0 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
2a1b0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
2a1c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2a1d0 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
2a1e0 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
2a1f0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
2a200 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
2a210 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
2a220 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
2a230 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
2a240 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
2a250 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2a260 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
2a270 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
2a280 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
2a290 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
2a2a0 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
2a2b0 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
2a2c0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
2a2d0 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
2a2e0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2a2f0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2a300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2a310 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
2a320 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
2a330 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
2a340 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
2a350 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
2a360 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
2a370 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a380 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
2a390 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
2a3a0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
2a3b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2a3c0 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
2a3d0 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
2a3e0 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
2a3f0 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
2a400 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e  (DbPage*) /* Fun
2a410 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69  ction to reiniti
2a420 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29  alize pages */.)
2a430 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
2a440 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2a450 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
2a460 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
2a470 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
2a480 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2a490 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
2a4a0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2a4b0 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
2a4c0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
2a4d0 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
2a4e0 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
2a4f0 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
2a500 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
2a510 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a520 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
2a530 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
2a540 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
2a550 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
2a560 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
2a570 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
2a580 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
2a590 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
2a5a0 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
2a5b0 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
2a5c0 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
2a5d0 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
2a5e0 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
2a5f0 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
2a600 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
2a610 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
2a620 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2a630 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
2a640 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
2a650 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
2a660 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
2a670 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
2a680 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
2a690 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  */.  int noReadl
2a6a0 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
2a6b0 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
2a6c0 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  )!=0;  /* True t
2a6d0 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b  o omit read-lock
2a6e0 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
2a6f0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
2a700 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
2a710 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2a720 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
2a730 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67  e */.  u32 szPag
2a740 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
2a750 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2a760 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
2a770 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e  ge size */.  con
2a780 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20  st char *zUri = 
2a790 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67  0;    /* URI arg
2a7a0 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
2a7b0 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20  nt nUri = 0;    
2a7c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2a7d0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52  r of bytes of UR
2a7e0 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20  I args at *zUri 
2a7f0 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
2a800 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61  out how much spa
2a810 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ce is required f
2a820 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
2a830 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a  file-handle.  **
2a840 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20   (there are two 
2a850 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69  of them, the mai
2a860 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  n journal and th
2a870 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20  e sub-journal). 
2a880 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65  This.  ** is the
2a890 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72   maximum space r
2a8a0 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69  equired for an i
2a8b0 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
2a8c0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20   file handle .  
2a8d0 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72  ** and a regular
2a8e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
2a8f0 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20  ndle. Note that 
2a900 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  a "regular journ
2a910 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20  al-handle".  ** 
2a920 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65 72  may be a wrapper
2a930 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68   capable of cach
2a940 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f  ing the first po
2a950 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  rtion of the jou
2a960 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
2a970 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c  n memory to impl
2a980 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63  ement the atomic
2a990 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
2a9a0 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73  ion (see .  ** s
2a9b0 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e  ource file journ
2a9c0 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  al.c)..  */.  if
2a9d0 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  ( sqlite3Journal
2a9e0 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74  Size(pVfs)>sqlit
2a9f0 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
2aa00 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  () ){.    journa
2aa10 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
2aa20 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  D8(sqlite3Journa
2aa30 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20  lSize(pVfs));.  
2aa40 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e  }else{.    journ
2aa50 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
2aa60 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  ND8(sqlite3MemJo
2aa70 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20  urnalSize());.  
2aa80 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
2aa90 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
2aaa0 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20  to NULL in case 
2aab0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
2aac0 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
2aad0 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   0;..#ifndef SQL
2aae0 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
2aaf0 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  B.  if( flags & 
2ab00 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a  PAGER_MEMORY ){.
2ab10 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
2ab20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
2ab30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2ab40 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
2ab50 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
2ab60 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
2ab70 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
2ab80 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
2ab90 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
2aba0 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
2abb0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
2abc0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
2abd0 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
2abe0 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
2abf0 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
2ac00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2ac10 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2ac20 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e  me[0] ){.    con
2ac30 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
2ac40 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  nPathname = pVfs
2ac50 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
2ac60 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2ac70 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50  sqlite3Malloc(nP
2ac80 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20  athname*2);.    
2ac90 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2aca0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2acb0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2acc0 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61     }.    zPathna
2acd0 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61  me[0] = 0; /* Ma
2ace0 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69  ke sure initiali
2acf0 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c  zed even if Full
2ad00 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73  Pathname() fails
2ad10 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2ad20 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
2ad30 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
2ad40 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
2ad50 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e  Pathname);.    n
2ad60 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2ad70 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2ad80 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a  name);.    z = z
2ad90 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65  Uri = &zFilename
2ada0 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
2adb0 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a  (zFilename)+1];.
2adc0 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b      while( *z ){
2add0 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2ade0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2adf0 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  ;.      z += sql
2ae00 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
2ae10 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72  1;.    }.    nUr
2ae20 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20  i = (int)(&z[1] 
2ae30 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73  - zUri);.    ass
2ae40 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a  ert( nUri>=0 );.
2ae50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ae60 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61  TE_OK && nPathna
2ae70 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74  me+8>pVfs->mxPat
2ae80 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f  hname ){.      /
2ae90 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2aea0 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
2aeb0 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71  journal path req
2aec0 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
2aed0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  * the database b
2aee0 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c  eing opened will
2aef0 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56   be more than pV
2af00 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20  fs->mxPathname. 
2af10 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e       ** bytes in
2af20 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65   length. This me
2af30 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
2af40 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
2af50 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  d,.      ** as i
2af60 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
2af70 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  ssible to open t
2af80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2af90 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  or even.      **
2afa0 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74   check for a hot
2afb0 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20  -journal before 
2afc0 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a  reading..      *
2afd0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
2afe0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2aff0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
2b000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b010 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2b020 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
2b030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2b040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2b050 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
2b060 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20  y for the Pager 
2b070 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68  structure, PCach
2b080 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20  e object, the.  
2b090 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65  ** three file de
2b0a0 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64  scriptors, the d
2b0b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2b0c0 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  e and the journa
2b0d0 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  l .  ** file nam
2b0e0 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e  e. The layout in
2b0f0 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f   memory is as fo
2b100 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
2b110 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63       Pager objec
2b120 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2b130 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67       (sizeof(Pag
2b140 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  er) bytes).  ** 
2b150 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63      PCache objec
2b160 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2b170 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63      (sqlite3Pcac
2b180 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a  heSize() bytes).
2b190 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2b1a0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  e file handle   
2b1b0 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e           (pVfs->
2b1c0 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a  szOsFile bytes).
2b1d0 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75    **     Sub-jou
2b1e0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2b1f0 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61           (journa
2b200 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
2b210 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a  .  **     Main j
2b220 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2b230 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  le        (journ
2b240 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2b250 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2b260 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  ase file name   
2b270 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2b280 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20  hname+1 bytes). 
2b290 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20   **     Journal 
2b2a0 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2b2b0 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2b2c0 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20  me+8+1 bytes).  
2b2d0 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20  */.  pPtr = (u8 
2b2e0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
2b2f0 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28  ero(.    ROUND8(
2b300 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
2b310 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72   +      /* Pager
2b320 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
2b330 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53    ROUND8(pcacheS
2b340 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ize) +          
2b350 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
2b360 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  t */.    ROUND8(
2b370 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20  pVfs->szOsFile) 
2b380 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d  +       /* The m
2b390 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
2b3a0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
2b3b0 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  ze * 2 +        
2b3c0 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
2b3d0 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
2b3e0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31     nPathname + 1
2b3f0 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20   + nUri +       
2b400 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a    /* zFilename *
2b410 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  /.    nPathname 
2b420 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20  + 8 + 1         
2b430 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c       /* zJournal
2b440 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2b450 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
2b460 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20  + nPathname + 4 
2b470 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  + 1             
2b480 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64   /* zWal */.#end
2b490 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  if.  );.  assert
2b4a0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2b4b0 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
2b4c0 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
2b4d0 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
2b4e0 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
2b4f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
2b500 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
2b510 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2b520 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
2b530 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
2b540 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
2b550 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2b560 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
2b570 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
2b580 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
2b590 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
2b5a0 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
2b5b0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2b5c0 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
2b5d0 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
2b5e0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2b5f0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2b600 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
2b610 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
2b620 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
2b630 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2b640 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
2b650 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2b660 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
2b670 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2b680 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
2b690 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2b6a0 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
2b6b0 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
2b6c0 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
2b6d0 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
2b6e0 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
2b6f0 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
2b700 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
2b710 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  name ){.    asse
2b720 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20  rt( nPathname>0 
2b730 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  );.    pPager->z
2b740 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61  Journal =   (cha
2b750 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74  r*)(pPtr += nPat
2b760 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2b770 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2b780 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2b790 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2b7a0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2b7b0 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c  py(&pPager->zFil
2b7c0 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b  ename[nPathname+
2b7d0 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  1], zUri, nUri);
2b7e0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2b7f0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50  er->zJournal, zP
2b800 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2b810 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2b820 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2b830 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2b840 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20  journal", 8);.  
2b850 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2b860 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2b870 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2b880 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64  zJournal);.#ifnd
2b890 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2b8a0 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  AL.    pPager->z
2b8b0 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  Wal = &pPager->z
2b8c0 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2b8d0 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  e+8+1];.    memc
2b8e0 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  py(pPager->zWal,
2b8f0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2b900 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2b910 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c  py(&pPager->zWal
2b920 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77  [nPathname], "-w
2b930 61 6c 22 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c  al", 4);.    sql
2b940 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2b950 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2b960 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29  e, pPager->zWal)
2b970 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
2b980 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
2b990 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ame);.  }.  pPag
2b9a0 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
2b9b0 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
2b9c0 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
2b9d0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
2b9e0 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  ager file..  */.
2b9f0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2ba00 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2ba10 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
2ba20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2ba30 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
2ba40 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2ba50 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
2ba60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
2ba70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
2ba80 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2ba90 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
2baa0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73  , &fout);.    as
2bab0 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a  sert( !memDb );.
2bac0 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2bad0 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2bae0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
2baf0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
2bb00 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
2bb10 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
2bb20 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
2bb30 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
2bb40 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2bb50 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
2bb60 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
2bb70 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
2bb80 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
2bb90 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
2bba0 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
2bbb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
2bbc0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2bbd0 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
2bbe0 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
2bbf0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2bc00 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
2bc10 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
2bc20 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
2bc30 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
2bc40 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
2bc50 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
2bc60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bc70 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29  K && !readOnly )
2bc80 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f  {.      setSecto
2bc90 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
2bca0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2bcb0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2bcc0 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
2bcd0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2bce0 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ZE);.      if( s
2bcf0 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
2bd00 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
2bd10 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2bd20 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53  er->sectorSize>S
2bd30 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2bd40 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
2bd50 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2bd60 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
2bd70 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2bd80 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ZE;.        }els
2bd90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  e{.          szP
2bda0 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70  ageDflt = (u32)p
2bdb0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2bdc0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2bdd0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2bde0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2bdf0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20  _WRITE.      {. 
2be00 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d         int iDc =
2be10 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
2be20 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
2be30 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
2be40 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
2be50 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2be60 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
2be70 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
2be80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2be90 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2bea0 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
2beb0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2bec0 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
2bed0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2bee0 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
2bef0 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
2bf00 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
2bf10 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2bf20 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
2bf30 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
2bf40 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
2bf50 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
2bf60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
2bf70 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
2bf80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2bf90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
2bfa0 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  dif.    }.  }els
2bfb0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
2bfc0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
2bfd0 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
2bfe0 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
2bff0 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
2c000 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
2c010 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
2c020 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
2c030 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
2c040 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
2c050 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
2c060 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
2c070 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
2c080 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2c090 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
2c0a0 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
2c0b0 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
2c0c0 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
2c0d0 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
2c0e0 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
2c0f0 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
2c100 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
2c110 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
2c120 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
2c130 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
2c140 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  rnal..    */ .  
2c150 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
2c160 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
2c170 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
2c180 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  R;.    pPager->e
2c190 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45  Lock = EXCLUSIVE
2c1a0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 61 64 4f  _LOCK;.    readO
2c1b0 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
2c1c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2c1d0 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
2c1e0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
2c1f0 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
2c200 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
2c210 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
2c220 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
2c230 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
2c240 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
2c250 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
2c260 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
2c270 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c280 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2c290 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
2c2a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2c2b0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
2c2c0 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
2c2d0 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
2c2e0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
2c2f0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
2c300 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
2c310 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69  r occurred in ei
2c320 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63  ther of the bloc
2c330 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74  ks above, free t
2c340 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73  he .  ** Pager s
2c350 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
2c360 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
2c370 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
2c380 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2c390 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54  ert( !pPager->pT
2c3a0 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73  mpSpace );.    s
2c3b0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
2c3c0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73  ager->fd);.    s
2c3d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
2c3e0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
2c3f0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  rc;.  }..  /* In
2c400 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61  itialize the PCa
2c410 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  che object. */. 
2c420 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c   assert( nExtra<
2c430 31 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61  1000 );.  nExtra
2c440 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61   = ROUND8(nExtra
2c450 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
2c460 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c  heOpen(szPageDfl
2c470 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44  t, nExtra, !memD
2c480 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2c490 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61         !memDb?pa
2c4a0 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f  gerStress:0, (vo
2c4b0 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61  id *)pPager, pPa
2c4c0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
2c4d0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f    PAGERTRACE(("O
2c4e0 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
2c4f0 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65  LEHANDLEID(pPage
2c500 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e  r->fd), pPager->
2c510 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49  zFilename));.  I
2c520 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
2c530 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
2c540 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2c550 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75  e))..  pPager->u
2c560 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  seJournal = (u8)
2c570 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
2c580 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
2c590 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26   = (noReadlock &
2c5a0 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30  & readOnly) ?1:0
2c5b0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2c5c0 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
2c5d0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2c5e0 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
2c5f0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
2c600 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2c610 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
2c620 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2c630 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
2c640 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2c650 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
2c660 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
2c670 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
2c680 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
2c690 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2c6a0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
2c6b0 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
2c6c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2c6d0 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41  = (tempFile ? PA
2c6e0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20  GER_EXCLUSIVE : 
2c6f0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b  PAGER_UNLOCK) );
2c700 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61  .#endif.  /* pPa
2c710 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
2c720 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
2c730 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65  empFile = (u8)te
2c740 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
2c750 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
2c760 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2c770 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
2c780 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
2c790 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2c7a0 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
2c7b0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
2c7c0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2c7d0 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
2c7e0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2c7f0 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20  = (u8)tempFile; 
2c800 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
2c810 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
2c820 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2c830 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
2c840 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50   (u8)memDb;.  pP
2c850 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
2c860 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20   (u8)readOnly;. 
2c870 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72   assert( useJour
2c880 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  nal || pPager->t
2c890 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61  empFile );.  pPa
2c8a0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
2c8b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
2c8c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
2c8d0 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
2c8e0 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
2c8f0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Sync==0 );.    a
2c900 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2c910 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
2c920 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c930 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d  r->walSyncFlags=
2c940 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2c950 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79  ( pPager->ckptSy
2c960 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2c970 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
2c980 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b  r->fullSync = 1;
2c990 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
2c9a0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2c9b0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
2c9c0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
2c9d0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2c9e0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c  YNC_NORMAL | WAL
2c9f0 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f  _SYNC_TRANSACTIO
2ca00 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  NS;.    pPager->
2ca10 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
2ca20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2ca30 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  AL;.  }.  /* pPa
2ca40 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
2ca50 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2ca60 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
2ca70 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2ca80 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
2ca90 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
2caa0 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b  a = (u16)nExtra;
2cab0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
2cac0 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51  alSizeLimit = SQ
2cad0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55  LITE_DEFAULT_JOU
2cae0 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b  RNAL_SIZE_LIMIT;
2caf0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
2cb00 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
2cb10 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73   tempFile );.  s
2cb20 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2cb30 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65  ger);.  if( !use
2cb40 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70  Journal ){.    p
2cb50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2cb60 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2cb70 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65  ALMODE_OFF;.  }e
2cb80 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b  lse if( memDb ){
2cb90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2cba0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2cbb0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2cbc0 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  ORY;.  }.  /* pP
2cbd0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
2cbe0 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
2cbf0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
2cc00 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a  dlerArg = 0; */.
2cc10 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
2cc20 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20  ter = xReinit;. 
2cc30 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
2cc40 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
2cc50 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
2cc60 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61  h)); */..  *ppPa
2cc70 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
2cc80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2cc90 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ;.}..../*.** Thi
2cca0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2ccb0 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
2ccc0 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
2ccd0 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
2cce0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
2ccf0 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
2cd00 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
2cd10 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
2cd20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
2cd30 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
2cd40 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
2cd50 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
2cd60 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
2cd70 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
2cd80 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
2cd90 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
2cda0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
2cdb0 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
2cdc0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
2cdd0 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  eria are met:.**
2cde0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72  .**   * The jour
2cdf0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2ce00 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
2ce10 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e  em, and.**   * N
2ce20 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  o process holds 
2ce30 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2ce40 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
2ce50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2ce60 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
2ce70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
2ce80 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20  self is greater 
2ce90 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20  than 0 bytes in 
2cea0 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  size, and.**   *
2ceb0 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
2cec0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2ced0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
2cee0 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a  s not 0x00..**.*
2cef0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
2cf00 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2cf10 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
2cf20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
2cf30 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
2cf40 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
2cf50 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
2cf60 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
2cf70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
2cf80 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
2cf90 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
2cfa0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2cfb0 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
2cfc0 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
2cfd0 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
2cfe0 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
2cff0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2d000 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
2d010 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
2d020 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68   not check if th
2d030 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20  ere is a master 
2d040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
2d050 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
2d060 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  f the file. If t
2d070 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61  here is, and tha
2d080 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
2d090 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f   file.** does no
2d0a0 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68  t exist, then th
2d0b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2d0c0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2d0d0 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
2d0e0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
2d0f0 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c  ill return a fal
2d100 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65  se-positive. The
2d110 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2d120 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
2d130 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
2d140 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d150 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
2d160 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20  ot and .** will 
2d170 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  not roll it back
2d180 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f  . .**.** If a ho
2d190 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
2d1a0 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74  s found to exist
2d1b0 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
2d1c0 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53  t to 1 and .** S
2d1d0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2d1e0 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75  d. If no hot-jou
2d1f0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
2d200 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69  sent, *pExists i
2d210 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e  s.** set to 0 an
2d220 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
2d230 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2d240 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2d250 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64  e trying.** to d
2d260 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2d270 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f   or not a hot-jo
2d280 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2d290 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a  s, the IO error.
2d2a0 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  ** code is retur
2d2b0 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
2d2c0 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73  e of *pExists is
2d2d0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
2d2e0 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
2d2f0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
2d300 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
2d310 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
2d320 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2d330 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2d340 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2d350 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2d360 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2d370 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20  */.  int exists 
2d380 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2d390 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2d3a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2d3b0 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
2d3c0 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73   jrnlOpen = !!is
2d3d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2d3e0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
2d3f0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2d400 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
2d410 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2d420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2d430 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2d440 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61  GER_OPEN );..  a
2d450 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d  ssert( jrnlOpen=
2d460 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f  =0 || ( sqlite3O
2d470 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
2d480 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a  istics(pPager->j
2d490 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45  fd) &.    SQLITE
2d4a0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
2d4b0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29  LE_WHEN_OPEN.  )
2d4c0 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d  );..  *pExists =
2d4d0 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f   0;.  if( !jrnlO
2d4e0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
2d4f0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2d500 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2d510 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
2d520 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
2d530 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66  xists);.  }.  if
2d540 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d550 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
2d560 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b   int locked = 0;
2d570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d580 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f  True if some pro
2d590 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
2d5a0 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20  ERVED lock */.. 
2d5b0 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69     /* Race condi
2d5c0 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74  tion here:  Anot
2d5d0 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
2d5e0 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64  t have been hold
2d5f0 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ing the.    ** t
2d600 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
2d610 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72   and have a jour
2d620 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20  nal open at the 
2d630 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2d640 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61  ) .    ** call a
2d650 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64  bove, but then d
2d660 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
2d670 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c  l and drop the l
2d680 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ock before.    *
2d690 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20  * we get to the 
2d6a0 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
2d6b0 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
2d6c0 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66  Lock() call.  If
2d6d0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
2d6e0 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72  the case, this r
2d6f0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69  outine might thi
2d700 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  nk there is a ho
2d710 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20  t journal when. 
2d720 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68     ** in fact th
2d730 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68  ere is none.  Th
2d740 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  is results in a 
2d750 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
2d760 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  hich will.    **
2d770 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
2d780 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72  y the playback r
2d790 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20  outine.  Ticket 
2d7a0 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20  #3883..    */.  
2d7b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2d7c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2d7d0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
2d7e0 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20  ocked);.    if( 
2d7f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d800 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
2d810 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
2d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d830 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2d840 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
2d850 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43  e */..      /* C
2d860 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66  heck the size of
2d870 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d880 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73  le. If it consis
2d890 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20  ts of 0 pages,. 
2d8a0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c       ** then del
2d8b0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
2d8c0 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65  file. See the he
2d8d0 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f  ader comment abo
2d8e0 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a  ve for .      **
2d8f0 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68   the reasoning h
2d900 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ere.  Delete the
2d910 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
2d920 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20  l file under.   
2d930 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44     ** a RESERVED
2d940 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72   lock to avoid r
2d950 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  ace conditions a
2d960 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c  nd to avoid viol
2d970 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b  ating.      ** [
2d980 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a  H33020]..      *
2d990 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
2d9a0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2d9b0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
2d9c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2d9d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d9e0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
2d9f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2da00 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
2da10 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oc();.          
2da20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  if( pagerLockDb(
2da30 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
2da40 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f  _LOCK)==SQLITE_O
2da50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2da60 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
2da70 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2da80 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
2da90 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
2daa0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2dab0 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63  ode ) pagerUnloc
2dac0 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
2dad0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2dae0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2daf0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
2db00 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2db10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2db20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
2db30 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
2db40 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
2db50 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
2db60 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
2db70 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
2db80 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2db90 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
2dba0 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
2dbb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
2dbc0 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
2dbd0 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
2dbe0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
2dbf0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
2dc00 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
2dc10 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
2dc20 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
2dc30 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
2dc40 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
2dc50 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
2dc60 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
2dc70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2dc80 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2dc90 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
2dca0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
2dcb0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
2dcc0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2dcd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2dce0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2dcf0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2dd00 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
2dd10 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20  >jfd, f, &f);.  
2dd20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dd30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2dd40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2dd50 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
2dd60 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2dd70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
2dd80 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
2dd90 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
2dda0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2ddb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ddc0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
2ddd0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
2dde0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2ddf0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
2de00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2de10 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2de20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2de30 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
2de40 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
2de50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2de60 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66     *pExists = (f
2de70 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  irst!=0);.      
2de80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
2de90 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
2dea0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
2deb0 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
2dec0 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   open the rollba
2ded0 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
2dee0 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20  in order to see 
2def0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
2df00 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f  * its has a zero
2df10 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
2df20 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
2df30 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
2df40 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
2df50 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
2df60 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
2df70 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
2df80 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
2df90 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
2dfa0 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
2dfb0 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
2dfc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
2dfd0 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
2dfe0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
2dff0 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
2e000 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
2e010 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
2e020 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
2e030 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
2e040 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
2e050 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
2e060 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
2e070 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
2e080 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
2e090 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
2e0a0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
2e0b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
2e0c0 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
2e0d0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
2e0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
2e0f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
2e100 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
2e110 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2e120 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2e130 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2e140 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2e150 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e160 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2e170 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
2e180 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
2e190 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2e1a0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
2e1b0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
2e1c0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2e1d0 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20  Acquire() until 
2e1e0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
2e1f0 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
2e200 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
2e210 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
2e220 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
2e230 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
2e240 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2e250 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
2e260 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
2e270 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
2e280 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
2e290 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
2e2a0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
2e2b0 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
2e2c0 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
2e2d0 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
2e2e0 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
2e2f0 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
2e300 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
2e310 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
2e320 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
2e330 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
2e340 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
2e350 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
2e360 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
2e370 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
2e380 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
2e390 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
2e3a0 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
2e3b0 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
2e3c0 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
2e3d0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
2e3e0 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
2e3f0 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
2e400 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
2e410 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
2e420 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
2e430 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
2e440 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
2e450 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
2e460 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
2e470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e480 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
2e490 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
2e4a0 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
2e4b0 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
2e4c0 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
2e4d0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
2e4e0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
2e4f0 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
2e500 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
2e510 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
2e520 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
2e530 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
2e540 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
2e550 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
2e560 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
2e570 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
2e580 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
2e590 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
2e5a0 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
2e5b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
2e5c0 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
2e5d0 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
2e5e0 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
2e5f0 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
2e600 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
2e610 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
2e620 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2e630 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2e640 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
2e650 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
2e660 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
2e670 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2e680 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72  al file or .** r
2e690 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
2e6a0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
2e6b0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2e6c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
2e6d0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
2e6e0 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
2e6f0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2e700 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e720 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2e730 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
2e740 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
2e750 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
2e760 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
2e770 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
2e780 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e  tstanding pages.
2e790 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68   This implies th
2e7a0 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61  at the pager sta
2e7b0 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72  te should either
2e7c0 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72  .  ** be OPEN or
2e7d0 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20   READER. READER 
2e7e0 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
2e7f0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
2e800 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a   or was in .  **
2e810 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
2e820 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  s mode..  */.  a
2e830 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
2e840 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
2e850 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
2e860 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
2e870 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
2e880 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
2e890 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2e8a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2e8b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
2e8c0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
2e8d0 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
2e8e0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
2e8f0 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74  >errCode) ){ ret
2e900 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
2e910 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70  ode; }..  if( !p
2e920 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2e930 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  r) && pPager->eS
2e940 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2e950 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
2e960 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
2e970 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e980 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
2e990 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
2e9a0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
2e9b0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
2e9c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2e9d0 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20 7c 7c 20  oReadlock==0 || 
2e9e0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
2e9f0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61   );..    if( pPa
2ea00 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d  ger->noReadlock=
2ea10 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2ea20 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
2ea30 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
2ea40 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2ea50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ea60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
2ea70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
2ea80 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck==NO_LOCK || p
2ea90 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
2eaa0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
2eab0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
2eac0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
2ead0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
2eae0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2eaf0 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
2eb00 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
2eb10 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
2eb20 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
2eb30 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
2eb40 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
2eb50 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
2eb60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2eb70 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53  pPager->eLock<=S
2eb80 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
2eb90 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a      rc = hasHotJ
2eba0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26  ournal(pPager, &
2ebb0 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  bHotJournal);.  
2ebc0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
2ebd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ebe0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
2ebf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48      }.    if( bH
2ec00 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
2ec10 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
2ec20 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2ec30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ec40 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
2ec50 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
2ec60 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
2ec70 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
2ec80 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
2ec90 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
2eca0 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
2ecb0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
2ecc0 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
2ecd0 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
2ece0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
2ecf0 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
2ed00 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
2ed10 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
2ed20 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
2ed30 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2ed40 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
2ed50 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
2ed60 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
2ed70 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
2ed80 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
2ed90 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
2eda0 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
2edb0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
2edc0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
2edd0 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
2ede0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
2edf0 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
2ee00 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
2ee10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ee20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
2ee30 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
2ee40 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
2ee50 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
2ee60 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
2ee70 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
2ee80 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2ee90 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
2eea0 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
2eeb0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
2eec0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
2eed0 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
2eee0 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
2eef0 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
2ef00 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
2ef10 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
2ef20 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
2ef30 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
2ef40 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
2ef50 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
2ef60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2ef70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ef80 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
2ef90 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
2efa0 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
2efb0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
2efc0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
2efd0 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
2efe0 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
2eff0 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
2f000 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
2f010 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
2f020 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
2f030 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
2f040 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
2f050 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
2f060 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
2f070 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
2f080 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
2f090 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
2f0a0 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
2f0b0 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
2f0c0 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
2f0d0 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
2f0e0 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
2f0f0 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
2f100 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
2f110 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
2f120 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
2f130 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
2f140 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
2f150 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
2f160 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
2f170 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
2f180 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
2f190 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
2f1a0 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
2f1b0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
2f1c0 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
2f1d0 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
2f1e0 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
2f1f0 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
2f200 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
2f210 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
2f220 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
2f230 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
2f240 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
2f250 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
2f260 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
2f270 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
2f280 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
2f290 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f2a0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
2f2b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f2c0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2f2d0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
2f2e0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
2f2f0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
2f300 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
2f310 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
2f320 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2f330 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
2f340 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
2f350 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2f360 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
2f370 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
2f380 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2f390 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
2f3a0 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
2f3b0 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
2f3c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2f3d0 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
2f3e0 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
2f3f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
2f400 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
2f410 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
2f420 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2f430 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
2f440 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
2f450 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
2f460 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f470 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2f480 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2f490 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
2f4a0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
2f4b0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
2f4c0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
2f4d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2f4e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2f4f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f500 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
2f510 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
2f520 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2f530 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2f540 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2f550 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2f560 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
2f570 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f580 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a      }.      }. .
2f590 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
2f5a0 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
2f5b0 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
2f5c0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
2f5d0 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
2f5e0 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
2f5f0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
2f600 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
2f610 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
2f620 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
2f630 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
2f640 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
2f650 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
2f660 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
2f670 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68   cache.  Sync th
2f680 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65  e hot journal be
2f690 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20  fore playing.   
2f6a0 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69     ** it back si
2f6b0 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  nce the process 
2f6c0 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64  that crashed and
2f6d0 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f   left the hot jo
2f6e0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70  urnal.      ** p
2f6f0 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20  robably did not 
2f700 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61  sync it and we a
2f710 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  re required to a
2f720 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20  lways sync.     
2f730 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
2f740 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69  before playing i
2f750 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  t back..      */
2f760 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
2f770 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2f780 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2f790 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f7a0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2f7b0 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
2f7c0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
2f7d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2f7e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f7f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
2f800 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
2f810 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  1);.          pP
2f820 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2f830 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20  AGER_OPEN;.     
2f840 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2f850 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
2f860 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
2f870 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f         pagerUnlo
2f880 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
2f890 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
2f8a0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
2f8b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f8c0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
2f8d0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69  ranch is taken i
2f8e0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2f8f0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
2f900 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  o open.        *
2f910 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61  * or roll back a
2f920 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69   hot-journal whi
2f930 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  le holding an EX
2f940 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
2f950 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
2f960 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  er_unlock() rout
2f970 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
2f980 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
2f990 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20  ing to unlock.  
2f9a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c        ** the fil
2f9b0 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b  e. If the unlock
2f9c0 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20   attempt fails, 
2f9d0 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b  then Pager.eLock
2f9e0 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20   must be.       
2f9f0 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   ** set to UNKNO
2fa00 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65  WN_LOCK (see the
2fa10 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
2fa20 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a  he #define for .
2fa30 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f          ** UNKNO
2fa40 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f  WN_LOCK above fo
2fa50 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
2fa60 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ). .        **. 
2fa70 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64         ** In ord
2fa80 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f  er to get pager_
2fa90 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74  unlock() to do t
2faa0 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65  his, set Pager.e
2fab0 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20  State to.       
2fac0 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
2fad0 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  now. This is not
2fae0 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65   actually counte
2faf0 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f  d as a transitio
2fb00 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  n.        ** to 
2fb10 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74  ERROR state in t
2fb20 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  he state diagram
2fb30 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
2fb40 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  his file,.      
2fb50 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e    ** since we kn
2fb60 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ow that the same
2fb70 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
2fb80 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72  nlock() will ver
2fb90 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f  y.        ** sho
2fba0 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20  rtly transition 
2fbb0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2fbc0 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61   to the OPEN sta
2fbd0 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20  te. Calling.    
2fbe0 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61      ** assert_pa
2fbf0 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c  ger_state() woul
2fc00 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69  d fail now, as i
2fc10 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
2fc20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
2fc30 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52   ** to be in ERR
2fc40 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
2fc50 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74  ere are zero out
2fc60 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20  standing page . 
2fc70 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65         ** refere
2fc80 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nces..        */
2fc90 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
2fca0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
2fcb0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
2fcc0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
2fcd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2fce0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2fcf0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
2fd00 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
2fd10 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  r->eLock==SHARED
2fd20 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20  _LOCK).         
2fd30 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
2fd40 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
2fd50 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41  Pager->eLock>SHA
2fd60 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
2fd70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2fd80 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
2fd90 69 6c 65 20 0a 20 20 20 20 20 26 26 20 28 70 50  ile .     && (pP
2fda0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c  ager->pBackup ||
2fdb0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
2fdc0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
2fdd0 70 50 43 61 63 68 65 29 3e 30 29 20 0a 20 20 20  pPCache)>0) .   
2fde0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2fdf0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
2fe00 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
2fe10 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  red on the datab
2fe20 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  ase file.      *
2fe30 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
2fe40 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e  already pages in
2fe50 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d   the cache (from
2fe60 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
2fe70 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69    ** read or wri
2fe80 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  te transaction).
2fe90 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
2fea0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
2feb0 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e       ** has been
2fec0 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
2fed0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
2fee0 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74  changed, flush t
2fef0 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68  he.      ** cach
2ff00 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
2ff10 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
2ff20 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
2ff30 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
2ff40 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
2ff50 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  ng.      ** at o
2ff60 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
2ff70 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
2ff80 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
2ff90 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
2ffa0 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
2ffb0 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
2ffc0 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
2ffd0 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
2ffe0 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
2fff0 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
30000 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
30010 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
30020 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
30030 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
30040 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54    ** .      ** T
30050 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
30060 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
30070 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
30080 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
30090 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
300a0 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
300b0 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
300c0 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
300d0 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69   that.      ** i
300e0 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
300f0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
30100 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20     Pgno nPage = 
30110 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  0;.      char db
30120 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
30130 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
30140 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20  rs)];..      rc 
30150 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
30160 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
30170 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
30180 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20   goto failed;.. 
30190 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30       if( nPage>0
301a0 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52   ){.        IOTR
301b0 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
301c0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
301d0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
301e0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
301f0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
30200 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
30210 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
30220 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
30230 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30240 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30250 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
30260 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
30270 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30280 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
30290 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
302a0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
302b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
302c0 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
302d0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
302e0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
302f0 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
30300 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
30310 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
30320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
30330 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
30340 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e  is a WAL file in
30350 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
30360 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61  , open this data
30370 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20  base in WAL.    
30380 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69  ** mode. Otherwi
30390 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  se, the followin
303a0 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  g function call 
303b0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  is a no-op..    
303c0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
303d0 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
303e0 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64  t(pPager);.#ifnd
303f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
30400 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  AL.    assert( p
30410 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c  Pager->pWal==0 |
30420 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
30430 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
30440 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
30450 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
30460 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
30470 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
30480 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  = pagerBeginRead
30490 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
304a0 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
304b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
304c0 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63  PAGER_OPEN && rc
304d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
304e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
304f0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
30500 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
30510 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
30520 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30530 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
30540 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
30550 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
30560 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
30570 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
30580 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
30590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
305a0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
305b0 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a  GER_READER;.  }.
305c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
305d0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
305e0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
305f0 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
30600 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
30610 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
30620 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
30630 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78   pager..**.** Ex
30640 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  cept, in locking
30650 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20  _mode=EXCLUSIVE 
30660 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
30670 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74  thing to in.** t
30680 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
30690 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20  nal, the unlock 
306a0 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64  is not performed
306b0 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a   and there is.**
306c0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c   nothing to roll
306d0 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f  back, so this ro
306e0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
306f0 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
30700 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55  d pagerUnlockIfU
30710 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  nused(Pager *pPa
30720 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c  ger){.  if( (sql
30730 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
30740 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
30750 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  he)==0) ){.    p
30760 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
30770 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
30780 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75   }.}../*.** Acqu
30790 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ire a reference 
307a0 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
307b0 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61  gno in pager pPa
307c0 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72  ger (a page.** r
307d0 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70  eference has typ
307e0 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74  e DbPage*). If t
307f0 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66  he requested ref
30800 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75  erence is .** su
30810 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
30820 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65  ned, it is copie
30830 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64  d to *ppPage and
30840 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
30850 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
30860 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
30870 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
30880 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20  he cache, it is 
30890 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
308a0 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70  herwise, a new p
308b0 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  age object is al
308c0 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
308d0 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a  lated with data.
308e0 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ** read from the
308f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
30900 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
30910 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
30920 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e   may.** choose n
30930 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ot to allocate a
30940 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
30950 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61   and may reuse a
30960 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62  n existing.** ob
30970 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74  ject with no out
30980 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
30990 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ces..**.** The e
309a0 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
309b0 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
309c0 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
309d0 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ed to zeros the 
309e0 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61  .** first time a
309f0 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
30a00 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20  into memory. If 
30a10 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74  the page request
30a20 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64  ed is .** alread
30a30 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77  y in the cache w
30a40 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
30a50 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
30a60 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64  n the extra.** d
30a70 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69  ata is left as i
30a80 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70  t was when the p
30a90 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c  age object was l
30aa0 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ast used..**.** 
30ab0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
30ac0 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72  image is smaller
30ad0 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
30ae0 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61  ted page or if a
30af0 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61   .** non-zero va
30b00 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73  lue is passed as
30b10 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70   the noContent p
30b20 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65  arameter and the
30b30 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70   .** requested p
30b40 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
30b50 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  dy stored in the
30b60 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20   cache, then no 
30b70 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20  .** actual disk 
30b80 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20  read occurs. In 
30b90 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65  this case the me
30ba0 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
30bb0 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e  e .** page is in
30bc0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
30bd0 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   zeros. .**.** I
30be0 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
30bf0 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
30c00 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
30c10 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
30c20 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
30c30 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
30c40 20 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65   in two seperate
30c50 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a   scenarios:.**.*
30c60 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64  *   a) When read
30c70 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ing a free-list 
30c80 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74  leaf page from t
30c90 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  he database, and
30ca0 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e  .**.**   b) When
30cb0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
30cc0 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
30cd0 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  k and we need to
30ce0 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20   load.**      a 
30cf0 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  new page into th
30d00 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69  e cache to be fi
30d10 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
30d20 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ta read.**      
30d30 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69  from the savepoi
30d40 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
30d50 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
30d60 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
30d70 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69   data returned i
30d80 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64  s zeroed instead
30d90 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61   of.** being rea
30da0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
30db0 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
30dc0 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72  y, the bits corr
30dd0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
30de0 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49  pgno in Pager.pI
30df0 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63  nJournal (bitvec
30e00 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
30e10 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
30e20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
30e30 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  ) and the PagerS
30e40 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
30e50 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66  point bitvecs of
30e60 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76   any open.** sav
30e70 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e  epoints are set.
30e80 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74   This means if t
30e90 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20  he page is made 
30ea0 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a  writable at any.
30eb0 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ** point in the 
30ec0 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20  future, using a 
30ed0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
30ee0 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73  agerWrite(), its
30ef0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c   contents.** wil
30f00 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c  l not be journal
30f10 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49  ed. This saves I
30f20 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  O..**.** The acq
30f30 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
30f40 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
30f50 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
30f60 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
30f70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
30f80 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
30f90 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
30fa0 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
30fb0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
30fc0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
30fd0 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
30fe0 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28  tine and Lookup(
30ff0 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
31000 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
31010 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
31020 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
31030 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
31040 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
31050 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
31060 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
31070 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
31080 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  eas Lookup().** 
31090 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
310a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
310b0 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
310c0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
310d0 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
310e0 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
310f0 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
31100 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
31110 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
31120 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28  ** Since Lookup(
31130 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
31140 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
31150 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
31160 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
31170 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
31180 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
31190 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
311a0 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
311b0 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
311c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
311d0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
311e0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
311f0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
31200 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
31210 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
31220 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
31230 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
31240 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
31250 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
31260 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
31270 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
31280 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
31290 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
312a0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
312b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
312c0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
312d0 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
312e0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
312f0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
31300 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b    if( pgno==0 ){
31310 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
31320 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
31330 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
31340 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
31350 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72  e error state, r
31360 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
31370 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a  mmediately. .  *
31380 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71  * Otherwise, req
31390 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72  uest the page fr
313a0 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61  om the PCache la
313b0 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  yer. */.  if( pP
313c0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
313d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
313e0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
313f0 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
31400 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31410 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
31420 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
31430 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20  , 1, ppPage);.  
31440 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
31450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
31460 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c   Either the call
31470 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68   to sqlite3Pcach
31480 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e 65  eFetch() returne
31490 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68  d an error or th
314a0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77  e.    ** pager w
314b0 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  as already in th
314c0 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
314d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
314e0 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
314f0 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30   ** Set pPg to 0
31500 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65   and jump to the
31510 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c   exception handl
31520 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20  er.  */.    pPg 
31530 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61  = 0;.    goto pa
31540 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
31550 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
31560 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d  *ppPage)->pgno==
31570 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
31580 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
31590 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28  ger==pPager || (
315a0 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
315b0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a  ==0 );..  if( (*
315c0 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20  ppPage)->pPager 
315d0 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  && !noContent ){
315e0 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
315f0 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20  case the pcache 
31600 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
31610 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   an initialized 
31620 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74  copy of.    ** t
31630 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20  he page. Return 
31640 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20  without further 
31650 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ado.  */.    ass
31660 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52  ert( pgno<=PAGER
31670 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e  _MAX_PGNO && pgn
31680 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
31690 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
316a0 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a  pPager->nHit++;.
316b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
316c0 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a  E_OK;..  }else{.
316d0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
316e0 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
316f0 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
31700 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
31710 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
31720 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a  nitialized.  */.
31730 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61  .    pPg = *ppPa
31740 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  ge;.    pPg->pPa
31750 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20  ger = pPager;.. 
31760 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
31770 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
31780 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
31790 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
317a0 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75  a page.    ** nu
317b0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
317c0 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75  n this, or the u
317d0 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61  nused locking-pa
317e0 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ge, is requested
317f0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
31800 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
31810 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
31820 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
31830 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
31840 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
31850 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
31860 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
31870 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
31880 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d  MEMDB || pPager-
31890 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20  >dbSize<pgno || 
318a0 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73  noContent || !is
318b0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
318c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
318d0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
318e0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
318f0 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
31900 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
31910 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
31920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
31930 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
31940 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65        /* Failure
31950 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73   to set the bits
31960 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61   in the InJourna
31970 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73  l bit-vectors is
31980 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20   benign..       
31990 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65   ** It merely me
319a0 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68  ans that we migh
319b0 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20  t do some extra 
319c0 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  work to journal 
319d0 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  a .        ** pa
319e0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
319f0 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
31a00 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65  naled.  Neverthe
31a10 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20  less, be sure . 
31a20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
31a30 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  t the case where
31a40 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20   a malloc error 
31a50 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
31a60 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20  ing to set .    
31a70 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20      ** a bit in 
31a80 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20  a bit vector..  
31a90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31aa0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
31ab0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
31ac0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70       if( pgno<=p
31ad0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
31ae0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  e ){.          T
31af0 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
31b00 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
31b10 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
31b20 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  nal, pgno);.    
31b30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
31b40 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
31b50 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
31b60 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
31b70 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65  rc = ) addToSave
31b80 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
31b90 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
31ba0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
31bb0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
31bc0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
31bd0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
31be0 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
31bf0 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44    memset(pPg->pD
31c00 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ata, 0, pPager->
31c10 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
31c20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
31c30 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
31c40 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
31c50 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
31c60 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
31c70 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20  pPager );.      
31c80 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b  pPager->nMiss++;
31c90 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
31ca0 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
31cb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31cc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31cd0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
31ce0 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
31cf0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
31d00 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
31d10 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
31d20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
31d30 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a  er_acquire_err:.
31d40 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
31d50 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
31d60 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69   pPg ){.    sqli
31d70 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
31d80 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55  g);.  }.  pagerU
31d90 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
31da0 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67  ager);..  *ppPag
31db0 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
31dc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
31dd0 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
31de0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
31df0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
31e00 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
31e10 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
31e20 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
31e30 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
31e40 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
31e50 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
31e60 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a  ot in cache. .**
31e70 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
31e80 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
31e90 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
31ea0 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
31eb0 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
31ec0 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
31ed0 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
31ee0 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
31ef0 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
31f00 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
31f10 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
31f20 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
31f30 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
31f40 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
31f50 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
31f60 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
31f70 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
31f80 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
31f90 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
31fa0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
31fb0 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
31fc0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
31fd0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
31fe0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
31ff0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
32000 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61  ( pgno!=0 );.  a
32010 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
32020 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61  PCache!=0 );.  a
32030 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
32040 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
32050 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  DER && pPager->e
32060 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
32070 4f 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  OR );.  sqlite3P
32080 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
32090 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
320a0 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65  , 0, &pPg);.  re
320b0 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a  turn pPg;.}../*.
320c0 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
320d0 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a  e reference..**.
320e0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
320f0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
32100 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
32110 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
32120 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
32130 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
32140 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
32150 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
32160 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
32170 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
32180 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
32190 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
321a0 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
321b0 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
321c0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
321d0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
321e0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61  f( pPg ){.    Pa
321f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
32200 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73  g->pPager;.    s
32210 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
32220 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61  ase(pPg);.    pa
32230 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
32240 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  d(pPager);.  }.}
32250 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
32260 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
32270 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
32280 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e  every write tran
32290 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72  saction..** Ther
322a0 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62  e must already b
322b0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
322c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
322d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
322e0 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  ** file when thi
322f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
32300 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  led..**.** Open 
32310 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
32320 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
32330 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f  r and write a jo
32340 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
32350 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
32360 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  it. If there are
32370 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
32380 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62  ts, open the sub
32390 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77  -journal.** as w
323a0 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
323b0 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
323c0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
323d0 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a   file is being .
323e0 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69  ** opened to wri
323f0 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f  te a rollback lo
32400 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  g for a transact
32410 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75  ion. It is not u
32420 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65  sed .** when ope
32430 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ning a hot journ
32440 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20  al file to roll 
32450 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
32460 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
32470 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
32480 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  en (as it may be
32490 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
324a0 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  de),.** then thi
324b0 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
324c0 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c  writes a journal
324d0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73   header to the s
324e0 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61  tart of the.** a
324f0 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65  lready open file
32500 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  . .**.** Whether
32510 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
32520 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
32530 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
32540 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65  ion, the.** Page
32550 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
32560 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73  vec structure is
32570 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a   allocated..**.*
32580 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
32590 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
325a0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
325b0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
325c0 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  n .** SQLITE_NOM
325d0 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  EM if the attemp
325e0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61  t to allocate Pa
325f0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66  ger.pInJournal f
32600 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20  ails, or .** an 
32610 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
32620 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74   opening or writ
32630 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
32640 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  file fails..*/.s
32650 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
32660 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
32670 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
32680 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
32690 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
326a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
326b0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
326c0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
326d0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
326e0 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61  >pVfs;   /* Loca
326f0 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70  l cache of vfs p
32700 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ointer */..  ass
32710 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
32720 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
32730 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73  R_LOCKED );.  as
32740 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
32750 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
32760 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
32770 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
32780 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
32790 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
327a0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
327b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
327c0 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a   no-op.  But on.
327d0 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68    ** the other h
327e0 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  and, this routin
327f0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
32800 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  d if we are alre
32810 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65  ady in.  ** an e
32820 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
32830 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
32840 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
32850 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
32860 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61  Code;..  if( !pa
32870 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
32880 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
32890 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
328a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
328b0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
328c0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
328d0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
328e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
328f0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
32900 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
32910 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
32920 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
32930 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65   }.  .    /* Ope
32940 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
32950 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  le if it is not 
32960 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f  already open. */
32970 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e  .    if( !isOpen
32980 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
32990 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
329a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
329b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
329c0 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
329d0 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
329e0 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
329f0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65  ->jfd);.      }e
32a00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  lse{.        con
32a10 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20  st int flags =  
32a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a30 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f   /* VFS flags to
32a40 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
32a50 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
32a60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
32a70 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
32a80 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
32a90 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d      (pPager->tem
32aa0 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20  pFile ? .       
32ab0 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
32ac0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
32ad0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
32ae0 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20  _JOURNAL):.     
32af0 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
32b00 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
32b10 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
32b20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45   #ifdef SQLITE_E
32b30 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
32b40 54 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  TE.        rc = 
32b50 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
32b60 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  en(.            
32b70 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
32b80 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
32b90 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
32ba0 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
32bb0 72 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  r).        );.  
32bc0 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63  #else.        rc
32bd0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
32be0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
32bf0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
32c00 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
32c10 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20  .  #endif.      
32c20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
32c30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
32c40 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
32c50 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  jfd) );.    }.  
32c60 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
32c70 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
32c80 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
32c90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
32ca0 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d open .    ** t
32cb0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
32cc0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  f necessary..   
32cd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
32ce0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32cf0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
32d00 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  k if all of thes
32d10 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71  e are really req
32d20 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
32d30 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
32d40 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
32d50 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
32d60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
32d70 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
32d80 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
32d90 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  alHdr = 0;.     
32da0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
32db0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
32dc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
32dd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32de0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
32df0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
32e00 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
32e10 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
32e20 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c  urnal = 0;.  }el
32e30 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
32e40 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
32e50 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
32e60 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65  KED );.    pPage
32e70 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
32e80 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
32e90 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  D;.  }..  return
32ea0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
32eb0 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  gin a write-tran
32ec0 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
32ed0 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f  pecified pager o
32ee0 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20  bject. If a .** 
32ef0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
32f00 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
32f10 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20  en opened, this 
32f20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
32f30 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
32f40 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e  e exFlag argumen
32f50 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  t is false, then
32f60 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
32f70 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  t a RESERVED.** 
32f80 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
32f90 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78  base file. If ex
32fa0 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
32fb0 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
32fc0 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53  ast.** an EXCLUS
32fd0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63  IVE lock. If suc
32fe0 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  h a lock is alre
32ff0 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63  ady held, no loc
33000 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  king .** functio
33010 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65  ns need be calle
33020 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
33030 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
33040 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ument is non-zer
33050 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d  o, then any sub-
33060 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a  journal opened.*
33070 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  * within this tr
33080 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
33090 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69  e opened as an i
330a0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54  n-memory file. T
330b0 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66  his.** has no ef
330c0 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d  fect if the sub-
330d0 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61  journal is alrea
330e0 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74  dy opened (as it
330f0 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20   may be when.** 
33100 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
33110 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66  sive mode) or if
33120 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
33130 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
33140 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  e a.** sub-journ
33150 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49  al. If the subjI
33160 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
33170 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61   is zero, then a
33180 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73  ny required.** s
33190 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d  ub-journal is im
331a0 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d  plemented in-mem
331b0 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73  ory if pPager is
331c0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
331d0 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75  tabase, .** or u
331e0 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79  sing a temporary
331f0 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e   file otherwise.
33200 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
33210 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20  agerBegin(Pager 
33220 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46  *pPager, int exF
33230 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d  lag, int subjInM
33240 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63  emory){.  int rc
33250 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
33260 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
33270 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70 50  Code ) return pP
33280 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
33290 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
332a0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
332b0 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d  EADER && pPager-
332c0 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52  >eState<PAGER_ER
332d0 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ROR );.  pPager-
332e0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20  >subjInMemory = 
332f0 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  (u8)subjInMemory
33300 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ;..  if( ALWAYS(
33310 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33320 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b  PAGER_READER) ){
33330 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
33340 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
33350 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  =0 );..    if( p
33360 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
33370 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
33380 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
33390 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
333a0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
333b0 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a  clusive, and an.
333c0 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
333d0 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
333e0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
333f0 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74  lready held, obt
33400 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ain it now..    
33410 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
33420 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
33430 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
33440 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
33450 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31  pPager->pWal, -1
33460 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
33470 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
33480 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
33490 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
334a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
334b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
334c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
334d0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
334e0 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
334f0 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
33500 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
33510 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20      /* Grab the 
33520 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
33530 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73  e log file. If s
33540 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61  uccessful, upgra
33550 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50  de to.      ** P
33560 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
33570 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
33580 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
33590 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
335a0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  er..      ** The
335b0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73   busy-handler is
335c0 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20   not invoked if 
335d0 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
335e0 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  on already.     
335f0 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72   ** holds the wr
33600 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73  ite-lock. If pos
33610 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72  sible, the upper
33620 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c   layer will call
33630 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
33640 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33650 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
33660 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
33670 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  >pWal);.    }els
33680 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61  e{.      /* Obta
33690 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
336a0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
336b0 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
336c0 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
336d0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75  .      ** is tru
336e0 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74  e, then immediat
336f0 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73  ely upgrade this
33700 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
33710 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
33720 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   ** busy-handler
33730 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65   callback can be
33740 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61   used when upgra
33750 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c  ding to the EXCL
33760 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c  USIVE.      ** l
33770 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
33780 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
33790 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
337a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
337b0 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
337c0 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
337d0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
337e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
337f0 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  & exFlag ){.    
33800 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
33810 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
33820 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
33830 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
33840 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
33850 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33860 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20     /* Change to 
33870 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
33880 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
33890 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20      ** WAL mode 
338a0 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74  sets Pager.eStat
338b0 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45  e to PAGER_WRITE
338c0 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48  R_LOCKED or CACH
338d0 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68  EMOD.      ** wh
338e0 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65  en it has an ope
338f0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  n transaction, b
33900 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f  ut never to DBMO
33910 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20  D or FINISHED.. 
33920 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
33930 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65  because in those
33940 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65   states the code
33950 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61   to roll back sa
33960 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
33970 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d  * transactions m
33980 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f  ay copy data fro
33990 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
339a0 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  l into the datab
339b0 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  ase .      ** fi
339c0 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e  le as well as in
339d0 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
339e0 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62  e. Which would b
339f0 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a  e incorrect in .
33a00 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
33a10 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
33a20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
33a30 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
33a40 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50  LOCKED;.      pP
33a50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
33a60 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
33a70 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
33a80 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50  >dbFileSize = pP
33a90 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
33aa0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
33ab0 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
33ac0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
33ad0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
33ae0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  f = 0;.    }..  
33af0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
33b00 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
33b10 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
33b20 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61  _READER );.    a
33b30 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
33b40 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
33b50 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
33b60 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
33b70 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
33b80 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
33b90 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  ager) );.  }..  
33ba0 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
33bb0 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
33bc0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
33bd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
33be0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
33bf0 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65  single data page
33c00 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
33c10 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
33c20 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
33c30 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  main journal or 
33c40 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72  sub-journal as r
33c50 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20  equired. If the 
33c60 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
33c70 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  into.** one of t
33c80 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  he journals, the
33c90 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
33ca0 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  it is set in the
33cb0 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f   .** Pager.pInJo
33cc0 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64  urnal bitvec and
33cd0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
33ce0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
33cf0 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61   bitvecs.** of a
33d00 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ny open savepoin
33d10 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ts as appropriat
33d20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
33d30 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
33d40 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
33d50 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
33d60 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70  Data;.  Pager *p
33d70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
33d80 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
33d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
33da0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
33db0 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65   not called unle
33dc0 73 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ss a write-trans
33dd0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
33de0 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74  dy .  ** been st
33df0 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e  arted. The journ
33e00 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
33e10 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61  ay not be open a
33e20 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
33e30 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63  ** It is never c
33e40 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52  alled in the ERR
33e50 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  OR state..  */. 
33e60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33e70 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
33e80 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
33e90 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
33ea0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
33eb0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
33ec0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
33ed0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
33ee0 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
33ef0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
33f00 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
33f10 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  er) );..  /* If 
33f20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  an error has bee
33f30 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74  n previously det
33f40 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68  ected, report th
33f50 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a  e same error.  *
33f60 2a 20 61 67 61 69 6e 2e 20 54 68 69 73 20 73 68  * again. This sh
33f70 6f 75 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c  ould not happen,
33f80 20 62 75 74 20 74 68 65 20 63 68 65 63 6b 20 70   but the check p
33f90 72 6f 76 69 64 65 73 20 72 6f 62 75 73 74 6e 65  rovides robustne
33fa0 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ss. */.  if( NEV
33fb0 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
33fc0 64 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50  de) )  return pP
33fd0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
33fe0 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65    /* Higher-leve
33ff0 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72  l routines never
34000 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
34010 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20  ion if database 
34020 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74  is not.  ** writ
34030 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b  able.  But check
34040 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f   anyway, just fo
34050 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  r robustness. */
34060 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
34070 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  ger->readOnly) )
34080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
34090 45 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  ERM;..  CHECK_PA
340a0 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54  GE(pPg);..  /* T
340b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
340c0 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e  needs to be open
340d0 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c  ed. Higher level
340e0 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61   routines have a
340f0 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61  lready.  ** obta
34100 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61  ined the necessa
34110 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69  ry locks to begi
34120 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  n the write-tran
34130 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65  saction, but the
34140 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  .  ** rollback j
34150 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
34160 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70   yet be open. Op
34170 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69  en it now if thi
34180 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  s is the case.. 
34190 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
341a0 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c   done before cal
341b0 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  ling sqlite3Pcac
341c0 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e  heMakeDirty() on
341d0 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a   the page. .  **
341e0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69   Otherwise, if i
341f0 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65  t were done afte
34200 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  r calling sqlite
34210 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
34220 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e  (), then.  ** an
34230 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63   error might occ
34240 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  ur and the pager
34250 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e   would end up in
34260 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
34270 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70  tate.  ** with p
34280 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64  ages marked as d
34290 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68  irty in the cach
342a0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
342b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
342c0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
342d0 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  D ){.    rc = pa
342e0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
342f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
34300 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34310 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
34320 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34330 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
34340 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
34350 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
34360 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
34370 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
34380 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
34390 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
343a0 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
343b0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
343c0 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
343d0 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
343e0 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
343f0 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
34400 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
34410 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67  (pPg);.  if( pag
34420 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
34430 26 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73  && !subjRequires
34440 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
34450 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
34460 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
34470 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20  .  }else{.  .   
34480 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
34490 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
344a0 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
344b0 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
344c0 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
344d0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
344e0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
344f0 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
34500 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
34510 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
34520 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
34530 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
34540 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
34550 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49  /.    if( !pageI
34560 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
34570 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
34580 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61  ager) ){.      a
34590 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
345a0 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
345b0 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
345c0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
345d0 4f 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70  OrigSize && isOp
345e0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
345f0 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  ){.        u32 c
34600 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68  ksum;.        ch
34610 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20  ar *pData2;.    
34620 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70      i64 iOff = p
34630 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
34640 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  f;..        /* W
34650 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
34660 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
34670 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
34680 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
34690 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
346a0 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
346b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
346c0 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
346d0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
346e0 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
346f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
34700 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
34710 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
34720 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34730 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
34740 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Hdr<=pPager->jou
34750 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20  rnalOff );.     
34760 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
34770 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
34780 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
34790 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
347a0 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73  a2);.        cks
347b0 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
347c0 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44  (pPager, (u8*)pD
347d0 61 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20  ata2);..        
347e0 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f  /* Even if an IO
347f0 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72   or diskfull err
34800 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
34810 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a  journalling the.
34820 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
34830 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f  in the block abo
34840 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64  ve, set the need
34850 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74  -sync flag for t
34860 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  he page..       
34870 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77   ** Otherwise, w
34880 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
34890 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
348a0 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e  ck, the logic in
348b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  .        ** play
348c0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
348d0 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20  will think that 
348e0 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
348f0 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20  o be restored.  
34900 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
34910 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
34920 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  nd if an IO erro
34930 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64  r occurs while d
34940 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20  oing so,.       
34950 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74   ** then corrupt
34960 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a  ion may follow..
34970 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
34980 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
34990 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
349a0 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
349b0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
349c0 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70  er->jfd, iOff, p
349d0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
349e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
349f0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
34a00 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
34a10 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
34a20 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
34a30 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
34a40 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20  ize, iOff+4);.  
34a50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34a60 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
34a70 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20   rc;.        rc 
34a80 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
34a90 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b  ager->jfd, iOff+
34aa0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34ab0 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  +4, cksum);.    
34ac0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34ad0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
34ae0 63 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52  c;..        IOTR
34af0 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
34b00 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
34b10 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
34b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34b30 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
34b40 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  lOff, pPager->pa
34b50 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20  geSize));.      
34b60 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
34b70 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
34b80 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  j_count);.      
34b90 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a    PAGERTRACE(("J
34ba0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
34bb0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61  d needSync=%d ha
34bc0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
34bd0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
34be0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
34bf0 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
34c00 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
34c10 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
34c20 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61  )?1:0), pager_pa
34c30 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
34c40 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
34c50 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20  journalOff += 8 
34c60 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
34c70 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  ze;.        pPag
34c80 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
34c90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
34ca0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
34cb0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
34cc0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
34cd0 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
34ce0 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
34cf0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
34d00 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
34d10 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
34d20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
34d30 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
34d40 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
34d50 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54        rc |= addT
34d60 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
34d70 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
34d80 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
34d90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34da0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
34db0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
34dc0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
34dd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
34de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
34df0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
34e00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
34e10 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
34e20 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MOD ){.         
34e30 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
34e40 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
34e50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34e60 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41    PAGERTRACE(("A
34e70 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
34e80 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
34e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34ea0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
34eb0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20  , pPg->pgno,.   
34ec0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
34ed0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
34ee0 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29  EED_SYNC)?1:0)))
34ef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
34f00 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
34f10 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
34f20 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
34f30 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
34f40 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
34f50 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
34f60 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
34f70 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
34f80 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
34f90 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
34fa0 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
34fb0 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
34fc0 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
34fd0 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
34fe0 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
34ff0 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
35000 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
35010 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
35020 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
35030 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72  (pPg) ){.      r
35040 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
35050 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ge(pPg);.    }. 
35060 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
35070 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
35080 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
35090 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
350a0 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e  >dbSize<pPg->pgn
350b0 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
350c0 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
350d0 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  gno;.  }.  retur
350e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
350f0 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
35100 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
35110 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
35120 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
35130 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e   .** making chan
35140 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54  ges to a page. T
35150 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63  he caller must c
35160 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
35170 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69  value .** of thi
35180 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62  s function and b
35190 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
351a0 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
351b0 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a   data unless .**
351c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
351d0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
351e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
351f0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
35200 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
35210 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
35220 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75   that this.** fu
35230 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c  nction also deal
35240 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  s with the speci
35250 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20  al case where 2 
35260 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a  or more pages.**
35270 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65   fit on a single
35280 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e   disk sector. In
35290 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63   this case all c
352a0 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73  o-resident pages
352b0 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65  .** must have be
352c0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
352d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
352e0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
352f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
35300 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
35310 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f  E_NOMEM or an IO
35320 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
35330 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70  eturned.** as ap
35340 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72  propriate. Other
35350 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
35360 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
35370 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65  agerWrite(DbPage
35380 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e   *pDbPage){.  in
35390 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
353a0 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ;..  PgHdr *pPg 
353b0 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
353c0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
353d0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f  ->pPager;.  Pgno
353e0 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20   nPagePerSector 
353f0 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  = (pPager->secto
35400 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61  rSize/pPager->pa
35410 67 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65  geSize);..  asse
35420 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
35430 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
35440 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73  _LOCKED );.  ass
35450 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
35460 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
35470 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
35480 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
35490 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
354a0 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  f( nPagePerSecto
354b0 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  r>1 ){.    Pgno 
354c0 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20  nPageCount;     
354d0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
354e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
354f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
35500 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20  /.    Pgno pg1; 
35510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35520 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66  /* First page of
35530 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
35540 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a  is located on. *
35550 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20  /.    int nPage 
35560 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
35570 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
35580 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  es starting at p
35590 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  g1 to journal */
355a0 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
355b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
355c0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
355d0 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  /.    int needSy
355e0 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nc = 0;         
355f0 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70  /* True if any p
35600 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45  age has PGHDR_NE
35610 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20  ED_SYNC */..    
35620 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74  /* Set the doNot
35630 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74  SyncSpill flag t
35640 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63  o 1. This is bec
35650 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61  ause we cannot a
35660 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f  llow.    ** a jo
35670 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
35680 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65  be written betwe
35690 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75  en the pages jou
356a0 72 6e 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a  rnaled by.    **
356b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
356c0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
356d0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
356e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
356f0 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d  >doNotSyncSpill=
35700 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
35710 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
35720 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  ++;..    /* This
35730 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
35740 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
35750 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
35760 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
35770 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
35780 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
35790 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
357a0 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
357b0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
357c0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
357d0 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
357e0 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
357f0 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
35800 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
35810 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
35820 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65   + 1;..    nPage
35830 43 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e  Count = pPager->
35840 64 62 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  dbSize;.    if( 
35850 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43  pPg->pgno>nPageC
35860 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
35870 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f  age = (pPg->pgno
35880 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d   - pg1)+1;.    }
35890 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50  else if( (pg1+nP
358a0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e  agePerSector-1)>
358b0 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
358c0 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
358d0 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20  eCount+1-pg1;.  
358e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
358f0 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53  Page = nPagePerS
35900 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  ector;.    }.   
35910 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29   assert(nPage>0)
35920 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31  ;.    assert(pg1
35930 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  <=pPg->pgno);.  
35940 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50    assert((pg1+nP
35950 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b  age)>pPg->pgno);
35960 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
35970 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d  ii<nPage && rc==
35980 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29  SQLITE_OK; ii++)
35990 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20  {.      Pgno pg 
359a0 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20  = pg1+ii;.      
359b0 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20  PgHdr *pPage;.  
359c0 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d      if( pg==pPg-
359d0 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65  >pgno || !sqlite
359e0 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
359f0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
35a00 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pg) ){.        i
35a10 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f  f( pg!=PAGER_MJ_
35a20 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
35a30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
35a40 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
35a50 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67  Pager, pg, &pPag
35a60 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
35a70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35a80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
35a90 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
35aa0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
35ab0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66      if( pPage->f
35ac0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
35ad0 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  SYNC ){.        
35ae0 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
35af0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
35b00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
35b10 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
35b20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
35b30 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
35b40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
35b50 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
35b60 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29  kup(pPager, pg))
35b70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
35b80 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
35b90 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
35ba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
35bb0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
35bc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
35bd0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
35be0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
35bf0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
35c00 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
35c10 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20  YNC flag is set 
35c20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e  for any of the n
35c30 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  Page pages .    
35c40 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
35c50 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64  g1, then it need
35c60 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20  s to be set for 
35c70 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63  all of them. Bec
35c80 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  ause.    ** writ
35c90 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68  ing to any of th
35ca0 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  ese nPage pages 
35cb0 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f  may damage the o
35cc0 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a  thers, the.    *
35cd0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * journal file m
35ce0 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63  ust contain sync
35cf0 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61  ()ed copies of a
35d00 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ll of them.    *
35d10 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20  * before any of 
35d20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74  them can be writ
35d30 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
35d40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
35d50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
35d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65  =SQLITE_OK && ne
35d70 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
35d80 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
35d90 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
35da0 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b  ; ii<nPage; ii++
35db0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  ){.        PgHdr
35dc0 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   *pPage = pager_
35dd0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
35de0 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20  g1+ii);.        
35df0 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
35e00 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c         pPage->fl
35e10 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
35e20 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
35e30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
35e40 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
35e50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35e60 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
35e70 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
35e80 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20  ncSpill==1 );.  
35e90 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
35ea0 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65  yncSpill--;.  }e
35eb0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
35ec0 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
35ed0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
35ee0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
35ef0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
35f00 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
35f10 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
35f20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
35f30 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
35f40 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
35f50 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
35f60 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
35f70 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
35f80 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
35f90 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
35fa0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
35fb0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
35fc0 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
35fd0 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
35fe0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
35ff0 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69  R_DIRTY;.}.#endi
36000 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
36010 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
36020 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
36030 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
36040 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
36050 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
36060 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
36070 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
36080 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
36090 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
360a0 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
360b0 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70  irty.  This happ
360c0 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
360d0 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61  , when.** the pa
360e0 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65  ge has been adde
360f0 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74  d as a leaf of t
36100 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
36110 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e  so its.** conten
36120 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74  t no longer matt
36130 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ers..**.** The o
36140 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
36150 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
36160 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
36170 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
36180 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
36190 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
361a0 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
361b0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
361c0 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
361d0 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
361e0 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
361f0 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
36200 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
36210 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75  ation can quadru
36220 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
36230 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54   large .** DELET
36240 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f  E operations..*/
36250 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
36260 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64  erDontWrite(PgHd
36270 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
36280 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
36290 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70  pPager;.  if( (p
362a0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
362b0 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72  DIRTY) && pPager
362c0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20  ->nSavepoint==0 
362d0 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
362e0 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E(("DONT_WRITE p
362f0 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
36300 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
36310 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
36320 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
36330 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
36340 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
36350 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
36360 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  |= PGHDR_DONT_WR
36370 49 54 45 3b 0a 20 20 20 20 70 61 67 65 72 5f 73  ITE;.    pager_s
36380 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
36390 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
363a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
363b0 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
363c0 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nt the value of 
363d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
363e0 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75  e .** change-cou
363f0 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  nter, stored as 
36400 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 4-byte big-end
36410 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72  ian integer star
36420 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65  ting at .** byte
36430 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68   offset 24 of th
36440 65 20 70 61 67 65 72 20 66 69 6c 65 2e 20 20 54  e pager file.  T
36450 68 65 20 73 65 63 6f 6e 64 61 72 79 20 63 68 61  he secondary cha
36460 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 74 0a 2a  nge counter at.*
36470 2a 20 39 32 20 69 73 20 61 6c 73 6f 20 75 70 64  * 92 is also upd
36480 61 74 65 64 2c 20 61 73 20 69 73 20 74 68 65 20  ated, as is the 
36490 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  SQLite version n
364a0 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20  umber at offset 
364b0 39 36 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68  96..**.** But th
364c0 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
364d0 69 66 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63  if the pPager->c
364e0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
364f0 6c 61 67 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  lag is false..**
36500 20 54 6f 20 61 76 6f 69 64 20 65 78 63 65 73 73   To avoid excess
36510 20 63 68 75 72 6e 69 6e 67 20 6f 66 20 70 61 67   churning of pag
36520 65 20 31 2c 20 74 68 65 20 75 70 64 61 74 65 20  e 1, the update 
36530 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63  only happens onc
36540 65 2e 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  e..** See also t
36550 68 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63  he pager_write_c
36560 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 72  hangecounter() r
36570 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73  outine that does
36580 20 61 6e 20 0a 2a 2a 20 75 6e 63 6f 6e 64 69 74   an .** uncondit
36590 69 6f 6e 61 6c 20 75 70 64 61 74 65 20 6f 66 20  ional update of 
365a0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
365b0 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ers..**.** If th
365c0 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66  e isDirectMode f
365d0 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  lag is zero, the
365e0 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62  n this is done b
365f0 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71  y calling .** sq
36600 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
36610 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65  ) on page 1, the
36620 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  n modifying the 
36630 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
36640 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e  ** page data. In
36650 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66   this case the f
36660 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61  ile will be upda
36670 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72  ted when the cur
36680 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rent.** transact
36690 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
366a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69  ..**.** The isDi
366b0 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61  rectMode flag ma
366c0 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65  y only be non-ze
366d0 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72  ro if the librar
366e0 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a  y was compiled.*
366f0 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  * with the SQLIT
36700 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
36710 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69  WRITE macro defi
36720 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
36730 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63  e,.** if isDirec
36740 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
36750 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
36760 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64   file is updated
36770 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20   directly.** by 
36780 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74  writing an updat
36790 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  ed version of pa
367a0 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c  ge 1 using a cal
367b0 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c  l to the .** sql
367c0 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75  ite3OsWrite() fu
367d0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
367e0 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
367f0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
36800 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
36810 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b  t isDirectMode){
36820 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
36830 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
36840 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
36850 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
36860 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
36870 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
36880 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
36890 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
368a0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
368b0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
368c0 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20  ;..  /* Declare 
368d0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  and initialize c
368e0 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
368f0 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20 74  'isDirect'. If t
36900 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77  he.  ** atomic-w
36910 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
36920 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20  n is enabled in 
36930 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e  this build, then
36940 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69   isDirect.  ** i
36950 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
36960 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   the value passe
36970 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65 63  d as the isDirec
36980 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a  tMode parameter.
36990 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e    ** to this fun
369a0 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
369b0 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73  , it is always s
369c0 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  et to zero..  **
369d0 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69  .  ** The idea i
369e0 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61 74  s that if the at
369f0 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
36a00 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20  ization is not. 
36a10 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63   ** enabled at c
36a20 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
36a30 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d   compiler can om
36a40 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a  it the tests of.
36a50 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20    ** 'isDirect' 
36a60 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61  below, as well a
36a70 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c  s the block encl
36a80 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  osed in the.  **
36a90 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29   "if( isDirect )
36aa0 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a  " condition..  *
36ab0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
36ac0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
36ad0 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49  RITE.# define DI
36ae0 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73  RECT_MODE 0.  as
36af0 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f  sert( isDirectMo
36b00 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  de==0 );.  UNUSE
36b10 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 69  D_PARAMETER(isDi
36b20 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65  rectMode);.#else
36b30 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54  .# define DIRECT
36b40 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f  _MODE isDirectMo
36b50 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  de.#endif..  if(
36b60 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65   !pPager->change
36b70 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61  CountDone && pPa
36b80 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b  ger->dbSize>0 ){
36b90 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48  .    PgHdr *pPgH
36ba0 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
36bb0 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20     /* Reference 
36bc0 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20  to page 1 */..  
36bd0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
36be0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69  r->tempFile && i
36bf0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
36c00 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  ) );..    /* Ope
36c10 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
36c20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
36c30 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
36c40 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
36c50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72  ager, 1, &pPgHdr
36c60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
36c70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d  PgHdr==0 || rc==
36c80 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
36c90 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65    /* If page one
36ca0 20 77 61 73 20 66 65 74 63 68 65 64 20 73 75 63   was fetched suc
36cb0 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74  cessfully, and t
36cc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36cd0 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  not.    ** opera
36ce0 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d  ting in direct-m
36cf0 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31  ode, make page 1
36d00 20 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65 6e   writable.  When
36d10 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20   not in .    ** 
36d20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61 67  direct mode, pag
36d30 65 20 31 20 69 73 20 61 6c 77 61 79 73 20 68 65  e 1 is always he
36d40 6c 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64 20  ld in cache and 
36d50 68 65 6e 63 65 20 74 68 65 20 50 61 67 65 72 47  hence the PagerG
36d60 65 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76  et().    ** abov
36d70 65 20 69 73 20 61 6c 77 61 79 73 20 73 75 63 63  e is always succ
36d80 65 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20 74  essful - hence t
36d90 68 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d  he ALWAYS on rc=
36da0 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20  =SQLITE_OK..    
36db0 2a 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52 45  */.    if( !DIRE
36dc0 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41 59  CT_MODE && ALWAY
36dd0 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  S(rc==SQLITE_OK)
36de0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
36df0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36e00 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a  (pPgHdr);.    }.
36e10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
36e20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36e30 2f 2a 20 41 63 74 75 61 6c 6c 79 20 64 6f 20 74  /* Actually do t
36e40 68 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65  he update of the
36e50 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
36e60 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 77  */.      pager_w
36e70 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
36e80 65 72 28 70 50 67 48 64 72 29 3b 0a 0a 20 20 20  er(pPgHdr);..   
36e90 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67     /* If running
36ea0 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c   in direct mode,
36eb0 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   write the conte
36ec0 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f  nts of page 1 to
36ed0 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20   the file. */.  
36ee0 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d      if( DIRECT_M
36ef0 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ODE ){.        c
36f00 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 3b  onst void *zBuf;
36f10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36f20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
36f30 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ize>0 );.       
36f40 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
36f50 70 50 67 48 64 72 2d 3e 70 44 61 74 61 2c 20 31  pPgHdr->pData, 1
36f60 2c 20 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 6, rc=SQLITE_N
36f70 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20 20  OMEM, zBuf);.   
36f80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36f90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36fa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36fb0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
36fc0 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
36fd0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a  ->pageSize, 0);.
36fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36ff0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37000 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
37010 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
37020 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  ountDone = 1;.  
37030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
37040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 61  lse{.        pPa
37050 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
37060 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Done = 1;.      
37070 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
37080 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65  Release the page
37090 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20   reference. */. 
370a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
370b0 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
370c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
370d0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
370e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
370f0 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20  o disk. This is 
37100 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d  a no-op for in-m
37110 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 0a  emory databases.
37120 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74 68  ** or pages with
37130 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
37140 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  c flag set..**.*
37150 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
37160 20 6f 72 20 69 66 20 63 61 6c 6c 65 64 20 6f 6e   or if called on
37170 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69   a pager for whi
37180 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  ch it is a no-op
37190 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
371a0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
371b0 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
371c0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
371d0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
371e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
371f0 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50  erSync(Pager *pP
37200 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
37210 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
37220 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
37230 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
37240 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
37250 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
37260 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
37270 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
37280 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  );.  }else if( i
37290 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
372a0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
372b0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 73   !MEMDB );.    s
372c0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
372d0 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  rol(pPager->fd, 
372e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e  SQLITE_FCNTL_SYN
372f0 43 5f 4f 4d 49 54 54 45 44 2c 20 28 76 6f 69 64  C_OMITTED, (void
37300 20 2a 29 26 72 63 29 3b 0a 20 20 7d 0a 20 20 72   *)&rc);.  }.  r
37310 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37320 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
37330 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
37340 6c 65 64 20 77 68 69 6c 65 20 61 20 77 72 69 74  led while a writ
37350 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
37360 20 61 63 74 69 76 65 20 69 6e 0a 2a 2a 20 72 6f   active in.** ro
37370 6c 6c 62 61 63 6b 2e 20 49 66 20 74 68 65 20 63  llback. If the c
37380 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20  onnection is in 
37390 57 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  WAL mode, this c
373a0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  all is a no-op. 
373b0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
373c0 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
373d0 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
373e0 79 20 68 61 76 65 20 61 6e 20 45 58 43 4c 55 53  y have an EXCLUS
373f0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  IVE lock on .** 
37400 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37410 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  e, an attempt is
37420 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
37430 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  one..**.** If th
37440 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
37450 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
37460 20 6f 72 20 74 68 65 20 61 74 74 65 6d 70 74 20   or the attempt 
37470 74 6f 20 6f 62 74 61 69 6e 20 69 74 20 69 73 0a  to obtain it is.
37480 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  ** successful, o
37490 72 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  r the connection
374a0 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c   is in WAL mode,
374b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
374c0 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  turned..** Other
374d0 77 69 73 65 2c 20 65 69 74 68 65 72 20 53 51 4c  wise, either SQL
374e0 49 54 45 5f 42 55 53 59 20 6f 72 20 61 6e 20 53  ITE_BUSY or an S
374f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
37500 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
37510 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  * returned..*/.i
37520 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 45  nt sqlite3PagerE
37530 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 50 61 67  xclusiveLock(Pag
37540 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
37550 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37560 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
37570 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37580 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
37590 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  OD .       || pP
375a0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
375b0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
375c0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
375d0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
375e0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
375f0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
37600 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
37610 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
37620 69 66 28 20 30 3d 3d 70 61 67 65 72 55 73 65 57  if( 0==pagerUseW
37630 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
37640 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
37650 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
37660 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
37670 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
37680 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
37690 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
376a0 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
376b0 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
376c0 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
376d0 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
376e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
376f0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
37700 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
37710 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
37720 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
37730 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
37740 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
37750 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
37760 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
37770 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
37780 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
37790 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
377a0 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a  ne ensures that:
377b0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  .**.**   * The d
377c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
377d0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75  nge-counter is u
377e0 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74  pdated,.**   * t
377f0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
37800 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65  nced (unless the
37810 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
37820 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73  timization is us
37830 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20  ed),.**   * all 
37840 64 69 72 74 79 20 70 61 67 65 73 20 61 72 65 20  dirty pages are 
37850 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
37860 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a  atabase file, .*
37870 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
37880 73 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  se file is trunc
37890 61 74 65 64 20 28 69 66 20 72 65 71 75 69 72 65  ated (if require
378a0 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74  d), and.**   * t
378b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
378c0 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   synced. .**.** 
378d0 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
378e0 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63  hat remains to c
378f0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
37900 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61  ction is to fina
37910 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65  lize .** (delete
37920 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  , truncate or ze
37930 72 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 72  ro the first par
37940 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61  t of) the journa
37950 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64  l file (or .** d
37960 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
37970 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
37980 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
37990 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
379a0 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
379b0 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
379c0 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
379d0 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
379e0 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
379f0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
37a00 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ne() call..**.**
37a10 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61   If the final pa
37a20 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63  rameter - noSync
37a30 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e   - is true, then
37a40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
37a50 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20  le itself.** is 
37a60 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20  not synced. The 
37a70 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c  caller must call
37a80 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
37a90 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a  c() directly to.
37aa0 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  ** sync the data
37ab0 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
37ac0 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50   calling CommitP
37ad0 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c  haseTwo() to del
37ae0 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ete the.** journ
37af0 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20  al file in this 
37b00 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  case..*/.int sql
37b10 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
37b20 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72  haseOne(.  Pager
37b30 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
37b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
37b50 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
37b60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
37b70 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
37b80 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
37b90 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
37ba0 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  al name */.  int
37bb0 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20   noSync         
37bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37bd0 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65  True to omit the
37be0 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62   xSync on the db
37bf0 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
37c00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
37c20 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
37c30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37c40 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37c50 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
37c60 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
37c70 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37c80 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
37c90 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
37ca0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37cb0 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
37cc0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37cd0 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
37ce0 52 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  R.  );.  assert(
37cf0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
37d00 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
37d10 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20    /* If a prior 
37d20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
37d30 72 65 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f  report that erro
37d40 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66  r again. */.  if
37d50 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
37d60 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
37d70 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
37d80 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  e;..  PAGERTRACE
37d90 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43  (("DATABASE SYNC
37da0 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65  : File=%s zMaste
37db0 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22  r=%s nSize=%d\n"
37dc0 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
37dd0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
37de0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ter, pPager->dbS
37df0 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ize));..  /* If 
37e00 6e 6f 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  no database chan
37e10 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61  ges have been ma
37e20 64 65 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79  de, return early
37e30 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
37e40 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
37e50 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
37e60 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
37e70 4f 4b 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42  OK;..  if( MEMDB
37e80 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
37e90 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
37ea0 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
37eb0 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
37ec0 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
37ed0 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  .    ** function
37ee0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
37ef0 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
37f00 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20  mostly a no-op. 
37f10 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20   However, any.  
37f20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70    ** backup in p
37f30 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f  rogress needs to
37f40 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
37f50 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
37f60 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
37f70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
37f80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
37f90 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
37fa0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 50  ager) ){.      P
37fb0 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71  gHdr *pList = sq
37fc0 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
37fd0 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
37fe0 61 63 68 65 29 3b 0a 20 20 20 20 20 20 50 67 48  ache);.      PgH
37ff0 64 72 20 2a 70 50 61 67 65 4f 6e 65 20 3d 20 30  dr *pPageOne = 0
38000 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
38010 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
38020 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 61 74 20  /* Must have at 
38030 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 20 66  least one page f
38040 6f 72 20 74 68 65 20 57 41 4c 20 63 6f 6d 6d 69  or the WAL commi
38050 74 20 66 6c 61 67 2e 0a 20 20 20 20 20 20 20 20  t flag..        
38060 2a 2a 20 54 69 63 6b 65 74 20 5b 32 64 31 61 35  ** Ticket [2d1a5
38070 63 36 37 64 66 63 32 33 36 33 65 34 34 66 32 39  c67dfc2363e44f29
38080 64 39 62 62 64 35 37 66 5d 20 32 30 31 31 2d 30  d9bbd57f] 2011-0
38090 35 2d 31 38 20 2a 2f 0a 20 20 20 20 20 20 20 20  5-18 */.        
380a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
380b0 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
380c0 26 70 50 61 67 65 4f 6e 65 29 3b 0a 20 20 20 20  &pPageOne);.    
380d0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 67      pList = pPag
380e0 65 4f 6e 65 3b 0a 20 20 20 20 20 20 20 20 70 4c  eOne;.        pL
380f0 69 73 74 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ist->pDirty = 0;
38100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
38110 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
38120 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
38130 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
38140 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
38150 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70  pagerWalFrames(p
38160 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70 50  Pager, pList, pP
38170 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31 29  ager->dbSize, 1)
38180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
38190 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
381a0 66 28 70 50 61 67 65 4f 6e 65 29 3b 0a 20 20 20  f(pPageOne);.   
381b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
381c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
381d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
381e0 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
381f0 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Cache);.      }.
38200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
38210 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
38220 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20  g block updates 
38230 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
38240 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  er. Exactly how 
38250 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  it.      ** does
38260 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e   this depends on
38270 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
38280 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74  the atomic-updat
38290 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  e optimization. 
382a0 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62       ** was enab
382b0 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
382c0 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73  ime, and if this
382d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65   transaction mee
382e0 74 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ts the .      **
382f0 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69   runtime criteri
38300 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65  a to use the ope
38310 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a  ration: .      *
38320 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20  *.      **    * 
38330 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  The file-system 
38340 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f  supports the ato
38350 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
38360 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ty for.      ** 
38370 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73       blocks of s
38380 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61  ize page-size, a
38390 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  nd .      **    
383a0 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73  * This commit is
383b0 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d   not part of a m
383c0 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
383d0 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
383e0 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79   **    * Exactly
383f0 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65   one page has be
38400 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20  en modified and 
38410 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  store in the jou
38420 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
38430 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
38440 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
38450 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64   was not enabled
38460 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
38470 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
38480 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
38490 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66  hangecounter() f
384a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
384b0 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
384c0 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20  change.      ** 
384d0 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69  counter in 'indi
384e0 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74  rect-mode'. If t
384f0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
38500 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62  is compiled in b
38510 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e  ut.      ** is n
38520 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f  ot applicable to
38530 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
38540 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a  n, call sqlite3J
38550 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20  ournalCreate(). 
38560 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20       ** to make 
38570 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sure the journal
38580 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c   file has actual
38590 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  ly been created,
385a0 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20   then call.     
385b0 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
385c0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
385d0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
385e0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69  nge-counter in i
385f0 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  ndirect.      **
38600 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a   mode. .      **
38610 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  .      ** Otherw
38620 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69  ise, if the opti
38630 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68  mization is both
38640 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70   enabled and app
38650 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a  licable,.      *
38660 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65  * then call page
38670 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
38680 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
38690 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
386a0 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ter.      ** in 
386b0 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49  'direct' mode. I
386c0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
386d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
386e0 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20 20  l never be.     
386f0 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20   ** created for 
38700 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  t