/ Hex Artifact Content
Login

Artifact 0dbf5ff5d5d7d3a21fcab82e9e4d129b6fe6314f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
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 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  +.**            
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 65 64 2c 20 61 6c 6c 20 74 68 61  occured, all tha
3090: 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20  t remains is to 
30a0: 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
30b0: 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20  rnal to.**      
30c0: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
30d0: 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72  action. If an er
30e0: 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74  ror did occur, t
30f0: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e  he caller will n
3100: 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72  eed.**      to r
3110: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
3120: 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  saction. .**.** 
3130: 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20   ERROR:.**.**   
3140: 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   The ERROR state
3150: 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e   is entered when
3160: 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66   an IO or disk-f
3170: 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75  ull error (inclu
3180: 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54  ding.**    SQLIT
3190: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f  E_IOERR_NOMEM) o
31a0: 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74  ccurs at a point
31b0: 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61   in the code tha
31c0: 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20  t makes it .**  
31d0: 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62    difficult to b
31e0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
31f0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
3200: 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e  state (cache con
3210: 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62  tents, .**    db
3220: 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20   size etc.) are 
3230: 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
3240: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
3250: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
3260: 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72  .**.**    Tempor
3270: 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73 20  ary pager files 
3280: 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45 52  may enter the ER
3290: 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 69  ROR state, but i
32a0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a  n-memory pagers.
32b0: 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a  **    cannot..**
32c0: 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70  .**    For examp
32d0: 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72  le, if an IO err
32e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
32f0: 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c  performing a rol
3300: 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68  lback, .**    th
3310: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3320: 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79  e page-cache may
3330: 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
3340: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74  nconsistent stat
3350: 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73  e..**    At this
3360: 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20   point it would 
3370: 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20  be dangerous to 
3380: 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52  change back to R
3390: 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20  EADER state.**  
33a0: 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61    (as usually ha
33b0: 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f  ppens after a ro
33c0: 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62  llback). Any sub
33d0: 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73 20  sequent readers 
33e0: 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f  might.**    repo
33f0: 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  rt database corr
3400: 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74  uption (due to t
3410: 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  he inconsistent 
3420: 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a  cache), and if.*
3430: 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61 64  *    they upgrad
3440: 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68  e to writers, th
3450: 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65  ey may inadverte
3460: 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  ntly corrupt the
3470: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
3480: 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74  file. To avoid t
3490: 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20  his hazard, the 
34a0: 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20 69  pager switches i
34b0: 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
34c0: 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61  ate.**    instea
34d0: 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c  d of READER foll
34e0: 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72  owing such an er
34f0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e  ror..**.**    On
3500: 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72 65  ce it has entere
3510: 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
3520: 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74  e, any attempt t
3530: 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72 0a  o use the pager.
3540: 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72  **    to read or
3550: 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74 75   write data retu
3560: 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76  rns an error. Ev
3570: 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61  entually, once a
3580: 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61  ll .**    outsta
3590: 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  nding transactio
35a0: 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62 61  ns have been aba
35b0: 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65  ndoned, the page
35c0: 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  r is able to.** 
35d0: 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61     transition ba
35e0: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
35f0: 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68 65  , discarding the
3600: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
3610: 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63   .**    page-cac
3620: 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  he and any other
3630: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65   in-memory state
3640: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
3650: 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a  e. Everything.**
3660: 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20      is reloaded 
3670: 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20  from disk (and, 
3680: 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f  if necessary, ho
3690: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
36a0: 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20  ck peformed).** 
36b0: 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74     when a read-t
36c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65  ransaction is ne
36d0: 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  xt opened on the
36e0: 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74 69   pager (transiti
36f0: 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20  oning.**    the 
3700: 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45  pager into READE
3710: 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68 61  R state). At tha
3720: 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74  t point the syst
3730: 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65 64  em has recovered
3740: 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65   .**    from the
3750: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20   error..**.**   
3760: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   Specifically, t
3770: 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69  he pager jumps i
3780: 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
3790: 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ate if:.**.**   
37a0: 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f     1. An error o
37b0: 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74 65  ccurs while atte
37c0: 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  mpting a rollbac
37d0: 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  k. This happens 
37e0: 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75  in.**         fu
37f0: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3800: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a  gerRollback()..*
3810: 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20  *.**      2. An 
3820: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
3830: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
3840: 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72   finalize a jour
3850: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
3860: 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20      following a 
3870: 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69  commit in functi
3880: 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  on sqlite3PagerC
3890: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e  ommitPhaseTwo().
38a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41  .**.**      3. A
38b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
38c0: 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20  hile attempting 
38d0: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
38e0: 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20  journal or.**   
38f0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
3900: 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  ile in function 
3910: 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e  pagerStress() in
3920: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
3930: 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d  p.**         mem
3940: 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e  ory..**.**    In
3950: 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74 68   other cases, th
3960: 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  e error is retur
3970: 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65  ned to the b-tre
3980: 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74  e layer. The b-t
3990: 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20  ree.**    layer 
39a0: 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20  then attempts a 
39b0: 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
39c0: 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72  on. If the error
39d0: 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20   condition .**  
39e0: 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65 20    persists, the 
39f0: 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65  pager enters the
3a00: 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69 61   ERROR state via
3a10: 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61   condition (1) a
3a20: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43  bove..**.**    C
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20  ondition (3) is 
3a40: 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
3a50: 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69 67  e it can be trig
3a60: 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64 2d  gered by a read-
3a70: 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65  only.**    state
3a80: 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77 69  ment executed wi
3a90: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
3aa0: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
3ab0: 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a  , if the error.*
3ac0: 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20 73  *    code were s
3ad0: 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74  imply returned t
3ae0: 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65 20  o the user, the 
3af0: 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75  b-tree layer wou
3b00: 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74  ld not.**    aut
3b10: 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d  omatically attem
3b20: 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  pt a rollback, a
3b30: 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  s it assumes tha
3b40: 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a  t an error in a.
3b50: 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20  **    read-only 
3b60: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74  statement cannot
3b70: 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65 72   leave the pager
3b80: 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c   in an internall
3b90: 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a  y inconsistent .
3ba0: 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a  **    state..**.
3bb0: 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67 65  **    * The Page
3bc0: 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  r.errCode variab
3bd0: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d  le is set to som
3be0: 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
3bf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
3c00: 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f     * There are o
3c10: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74  ne or more outst
3c20: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
3c30: 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74 65  s to pages (afte
3c40: 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61  r the.**      la
3c50: 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  st reference is 
3c60: 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67 65  dropped the page
3c70: 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61  r should move ba
3c80: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
3c90: 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70  )..**    * The p
3ca0: 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69  ager is not an i
3cb0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a  n-memory pager..
3cc0: 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  **    .**.** Not
3cd0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20  es:.**.**   * A 
3ce0: 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20 69  pager is never i
3cf0: 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f  n WRITER_DBMOD o
3d00: 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  r WRITER_FINISHE
3d10: 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a  D state if the.*
3d20: 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e  *     connection
3d30: 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20   is open in WAL 
3d40: 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e  mode. A WAL conn
3d50: 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  ection is always
3d60: 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f   in one.**     o
3d70: 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75 72  f the first four
3d80: 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20   states..**.**  
3d90: 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63   * Normally, a c
3da0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69  onnection open i
3db0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
3dc0: 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47   is never in PAG
3dd0: 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73  ER_OPEN.**     s
3de0: 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65 20  tate. There are 
3df0: 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20  two exceptions: 
3e00: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
3e10: 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  r exclusive-mode
3e20: 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e   has.**     been
3e30: 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20   turned on (and 
3e40: 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20  before any read 
3e50: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
3e60: 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20  tions are .**   
3e70: 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64    executed), and
3e80: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
3e90: 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22  is leaving the "
3ea0: 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a  error state"..**
3eb0: 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f  .**   * See also
3ec0: 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  : assert_pager_s
3ed0: 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  tate()..*/.#defi
3ee0: 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20  ne PAGER_OPEN   
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3f00: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
3f10: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
3f20: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50       1.#define P
3f30: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
3f40: 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64 65  ED         2.#de
3f50: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3f60: 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20  R_CACHEMOD      
3f70: 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   3.#define PAGER
3f80: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
3f90: 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65         4.#define
3fa0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49   PAGER_WRITER_FI
3fb0: 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a 23  NISHED       5.#
3fc0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
3fd0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
3fe0: 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20     6../*.** The 
3ff0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
4000: 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61  able is almost a
4010: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65  lways set to one
4020: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
4030: 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74  owing locking-st
4040: 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20  ates, according 
4050: 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72  to the lock curr
4060: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a  ently held on.**
4070: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4080: 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41  le: NO_LOCK, SHA
4090: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
40a0: 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55  ED_LOCK or EXCLU
40b0: 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68  SIVE_LOCK..** Th
40c0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b  is variable is k
40d0: 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20 61  ept up to date a
40e0: 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65  s locks are take
40f0: 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62  n and released b
4100: 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f  y.** the pagerLo
4110: 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65 72  ckDb() and pager
4120: 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70  UnlockDb() wrapp
4130: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ers..**.** If th
4140: 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72  e VFS xLock() or
4150: 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72   xUnlock() retur
4160: 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65  ns an error othe
4170: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55  r than SQLITE_BU
4180: 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20  SY.** (i.e. one 
4190: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
41a0: 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20 69  ERR subtypes), i
41b0: 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77  t is not clear w
41c0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
41d0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77   the operation w
41e0: 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49  as successful. I
41f0: 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73 74  n these circumst
4200: 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44  ances pagerLockD
4210: 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72  b() and.** pager
4220: 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20  UnlockDb() take 
4230: 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61  a conservative a
4240: 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20  pproach - eLock 
4250: 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74 65  is always update
4260: 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  d.** when unlock
4270: 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e  ing the file, an
4280: 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77  d only updated w
4290: 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  hen locking the 
42a0: 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56  file if the.** V
42b0: 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65  FS call is succe
42c0: 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c  ssful. This way,
42d0: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
42e0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65   variable may be
42f0: 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73   set.** to a les
4300: 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77  s exclusive (low
4310: 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74  er) value than t
4320: 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20  he lock that is 
4330: 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a  actually held.**
4340: 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
4350: 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20  evel, but it is 
4360: 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d  never set to a m
4370: 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76 61  ore exclusive va
4380: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
4390: 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e  is usually safe.
43a0: 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66   If an xUnlock f
43b0: 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20  ails or appears 
43c0: 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d  to fail, there m
43d0: 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20  ay .** be a few 
43e0: 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28  redundant xLock(
43f0: 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63  ) calls or a loc
4400: 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f  k may be held fo
4410: 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a  r longer than.**
4420: 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e   required, but n
4430: 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f  othing really go
4440: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
4450: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
4460: 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
4470: 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  se file is unloc
4480: 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65 72  ked as the pager
4490: 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45   moves.** from E
44a0: 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61  RROR to OPEN sta
44b0: 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  te. At this poin
44c0: 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  t there may be a
44d0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
44e0: 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c  e .** in the fil
44f0: 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65  e-system that ne
4500: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
4510: 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f   back (as part o
4520: 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44  f a OPEN->SHARED
4530: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20  .** transition, 
4540: 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  by the same page
4550: 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e  r or any other).
4560: 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   If the call to 
4570: 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69  xUnlock().** fai
4580: 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ls at this point
4590: 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
45a0: 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61  s left holding a
45b0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
45c0: 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f  , this.** can co
45d0: 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74  nfuse the call t
45e0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
45f0: 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65  Lock() call made
4600: 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a   later as part.*
4610: 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  * of hot-journal
4620: 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a   detection..**.*
4630: 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
4640: 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65  Lock() is define
4650: 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74  d as returning t
4660: 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73  rue "if there is
4670: 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20   a RESERVED .** 
4680: 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69  lock held by thi
4690: 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79  s process or any
46a0: 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68   others". So xCh
46b0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
46c0: 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74  may .** return t
46d0: 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20  rue because the 
46e0: 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73  caller itself is
46f0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
4700: 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a  USIVE lock (but.
4710: 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20  ** doesn't know 
4720: 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20  it because of a 
4730: 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69  previous error i
4740: 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74  n xUnlock). If t
4750: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61  his happens.** a
4760: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot-journal may
4770: 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72   be mistaken for
4780: 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67   a journal being
4790: 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61   created by an a
47a0: 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
47b0: 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  tion in another 
47c0: 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67  process, causing
47d0: 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20   SQLite to read 
47e0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
47f0: 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c  e.** without rol
4800: 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  ling it back..**
4810: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
4820: 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61  nd this, if a ca
4830: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20  ll to xUnlock() 
4840: 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63  fails when unloc
4850: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61  king the.** data
4860: 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f  base in the ERRO
4870: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
4880: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
4890: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a  NKNOWN_LOCK. It.
48a0: 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67  ** is only chang
48b0: 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61  ed back to a rea
48c0: 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20  l locking state 
48d0: 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  after a successf
48e0: 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c  ul call.** to xL
48f0: 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20  ock(EXCLUSIVE). 
4900: 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74  Also, the code t
4910: 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53  o do the OPEN->S
4920: 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e  HARED state tran
4930: 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20  sition.** omits 
4940: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20  the check for a 
4950: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50  hot-journal if P
4960: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
4970: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4980: 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74  K .** lock. Inst
4990: 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20  ead, it assumes 
49a0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78  a hot-journal ex
49b0: 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73  ists and obtains
49c0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   an EXCLUSIVE.**
49d0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
49e0: 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
49f0: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
4a00: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65  roll it back. Se
4a10: 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61  e function.** Pa
4a20: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
4a30: 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e  for more detail.
4a40: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f  .**.** Pager.eLo
4a50: 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73  ck may only be s
4a60: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4a70: 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  CK when the page
4a80: 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45  r is in .** PAGE
4a90: 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f  R_OPEN state..*/
4aa0: 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e  .#define UNKNOWN
4ab0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20  _LOCK           
4ac0: 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f       (EXCLUSIVE_
4ad0: 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41  LOCK+1)../*.** A
4ae0: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
4af0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
4b00: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
4b10: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
4b20: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
4b30: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
4b40: 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69  D,N,X,E) \.    i
4b50: 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20  f( P->xCodec && 
4b60: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
4b70: 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b  dec,D,N,X)==0 ){
4b80: 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43   E; }.# define C
4b90: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c  ODEC2(P,D,N,X,E,
4ba0: 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e  O) \.    if( P->
4bb0: 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28  xCodec==0 ){ O=(
4bc0: 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c  char*)D; }else \
4bd0: 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61  .    if( (O=(cha
4be0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d  r*)(P->xCodec(P-
4bf0: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29  >pCodec,D,N,X)))
4c00: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73  ==0 ){ E; }.#els
4c10: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
4c20: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f  1(P,D,N,X,E)   /
4c30: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
4c40: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4c50: 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a  ,X,E,O) O=(char*
4c60: 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )D.#endif../*.**
4c70: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
4c80: 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  owed sector size
4c90: 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20  . 64KiB. If the 
4ca0: 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65  xSectorsize() me
4cb0: 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73  thod .** returns
4cc0: 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20   a value larger 
4cd0: 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20  than this, then 
4ce0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4cf0: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
4d00: 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63  .** This could c
4d10: 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65  onceivably cause
4d20: 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c   corruption foll
4d30: 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61  owing a power fa
4d40: 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68  ilure on.** such
4d50: 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20   a system. This 
4d60: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20  is currently an 
4d70: 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d  undocumented lim
4d80: 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  it..*/.#define M
4d90: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30  AX_SECTOR_SIZE 0
4da0: 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e  x10000../*.** An
4db0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4dc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4dd0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4de0: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4df0: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e00: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e10: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e20: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e30: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e40: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e50: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e60: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e70: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4e80: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4e90: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ea0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4eb0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ec0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ed0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4ee0: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4ef0: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f00: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f10: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f20: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f30: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f40: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f50: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f60: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f70: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4f80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4f90: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fa0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fb0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fc0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4fd0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
4fe0: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
4ff0: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5000: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5010: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5020: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5030: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5040: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5050: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5060: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5070: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5080: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50b0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50c0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50d0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
50e0: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
50f0: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5100: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5110: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5120: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5130: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5140: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5150: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5160: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5170: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
5180: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51b0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
51e0: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
51f0: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5200: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5210: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5220: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5230: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  .};../*.** A ope
5240: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
5250: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73  an instance of s
5260: 74 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64  truct Pager. A d
5270: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
5280: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72   some of the mor
5290: 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62  e important memb
52a0: 65 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c  er variables fol
52b0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61  lows:.**.** eSta
52c0: 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63  te.**.**   The c
52d0: 75 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f  urrent 'state' o
52e0: 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
52f0: 63 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ct. See the comm
5300: 65 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a  ent and state.**
5310: 20 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65     diagram above
5320: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
5330: 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  on of the pager 
5340: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f  state..**.** eLo
5350: 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61  ck.**.**   For a
5360: 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61   real on-disk da
5370: 74 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72  tabase, the curr
5380: 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  ent lock held on
5390: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
53a0: 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  le -.**   NO_LOC
53b0: 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  K, SHARED_LOCK, 
53c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72  RESERVED_LOCK or
53d0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
53e0: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74  .**.**   For a t
53f0: 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
5400: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28  emory database (
5410: 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68  neither of which
5420: 20 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20   require any.** 
5430: 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76    locks), this v
5440: 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79  ariable is alway
5450: 73 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49  s set to EXCLUSI
5460: 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73  VE_LOCK. Since s
5470: 75 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73  uch.**   databas
5480: 65 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50  es always have P
5490: 61 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f  ager.exclusiveMo
54a0: 64 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63  de==1, this tric
54b0: 6b 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  ks the pager.** 
54c0: 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69    logic into thi
54d0: 6e 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c  nking that it al
54e0: 72 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68  ready has all th
54f0: 65 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20  e locks it will 
5500: 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28  ever.**   need (
5510: 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f  and no reason to
5520: 20 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a   release them)..
5530: 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20  **.**   In some 
5540: 28 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d  (obscure) circum
5550: 73 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61  stances, this va
5560: 72 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20  riable may also 
5570: 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55  be set to.**   U
5580: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65  NKNOWN_LOCK. See
5590: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
55a0: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
55b0: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
55c0: 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e  or.**   details.
55d0: 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75  .**.** changeCou
55e0: 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntDone.**.**   T
55f0: 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  his boolean vari
5600: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
5610: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
5620: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5630: 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62  r .**   (the 4-b
5640: 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  yte header field
5650: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
5660: 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  24 of the databa
5670: 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20  se file) is .** 
5680: 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f    not updated mo
5690: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65  re often than ne
56a0: 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  cessary. .**.** 
56b0: 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74    It is set to t
56c0: 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61  rue when the cha
56d0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
56e0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68  d is updated, wh
56f0: 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e  ich .**   can on
5700: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20  ly happen if an 
5710: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
5720: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
5730: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
5740: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
5750: 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77  (set to false) w
5760: 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75  henever an exclu
5770: 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a  sive lock is .**
5780: 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20     relinquished 
5790: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
57a0: 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20  file. Each time 
57b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
57c0: 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20   committed,.**  
57d0: 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   The changeCount
57e0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73  Done flag is ins
57f0: 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73  pected. If it is
5800: 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20   true, the work 
5810: 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67  of.**   updating
5820: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5830: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ter is omitted f
5840: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
5850: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
5860: 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69  *   This mechani
5870: 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68  sm means that wh
5880: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  en running in ex
5890: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20  clusive mode, a 
58a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20  connection .**  
58b0: 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74   need only updat
58c0: 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
58d0: 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74  nter once, for t
58e0: 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63  he first transac
58f0: 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74  tion.**   commit
5900: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61  ted..**.** setMa
5910: 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  ster.**.**   Whe
5920: 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  n PagerCommitPha
5930: 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65  seOne() is calle
5940: 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72  d to commit a tr
5950: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61  ansaction, it ma
5960: 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e  y.**   (or may n
5970: 6f 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61  ot) specify a ma
5980: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
5990: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
59a0: 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a  into the .**   j
59b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
59c0: 72 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20  re it is synced 
59d0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20  to disk..**.**  
59e0: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
59f0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  a journal file c
5a00: 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72  ontains a master
5a10: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
5a20: 20 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74   affects .**   t
5a30: 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20  he way in which 
5a40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5a50: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66   is finalized af
5a60: 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
5a70: 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d  ion is .**   com
5a80: 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
5a90: 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69   back when runni
5aa0: 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d  ng in "journal_m
5ab0: 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64  ode=PERSIST" mod
5ac0: 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75  e..**   If a jou
5ad0: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
5ae0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  ot contain a mas
5af0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b00: 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20  ter, it is.**   
5b10: 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65  finalized by ove
5b20: 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72  rwriting the fir
5b30: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
5b40: 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49  r with zeroes. I
5b50: 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63  f.**   it does c
5b60: 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d  ontain a master-
5b70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5b90: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a   is finalized .*
5ba0: 2a 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e  *   by truncatin
5bb0: 67 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74  g it to zero byt
5bc0: 65 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74  es, just as if t
5bd0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65  he connection we
5be0: 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67  re .**   running
5bf0: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5c00: 65 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65  e=truncate" mode
5c10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61  ..**.**   Journa
5c20: 6c 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e  l files that con
5c30: 74 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72  tain master jour
5c40: 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e  nal pointers can
5c50: 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64  not be finalized
5c60: 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20  .**   simply by 
5c70: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c80: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
5c90: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5ca0: 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61  , as the.**   ma
5cb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
5cc0: 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72  nter could inter
5cd0: 66 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f  fere with hot-jo
5ce0: 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
5cf0: 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65  f any.**   subse
5d00: 71 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70  quently interrup
5d10: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ted transaction 
5d20: 74 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20  that reuses the 
5d30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
5d40: 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69  .**   The flag i
5d50: 73 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f  s cleared as soo
5d60: 6e 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n as the journal
5d70: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5d80: 65 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20  ed (either.**   
5d90: 62 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  by PagerCommitPh
5da0: 61 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52  aseTwo or PagerR
5db0: 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20  ollback). If an 
5dc0: 49 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74  IO error prevent
5dd0: 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s the.**   journ
5de0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
5df0: 6e 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ng successfully 
5e00: 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73  finalized, the s
5e10: 65 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a  etMaster flag.**
5e20: 20 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e     is cleared an
5e30: 79 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61  yway (and the pa
5e40: 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f  ger will move to
5e50: 20 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a   ERROR state)..*
5e60: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c  *.** doNotSpill,
5e70: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a   doNotSyncSpill.
5e80: 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74 77  **.**   These tw
5e90: 6f 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  o boolean variab
5ea0: 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20  les control the 
5eb0: 62 65 68 61 76 69 6f 75 72 20 6f 66 20 63 61 63  behaviour of cac
5ec0: 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28  he-spills.**   (
5ed0: 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68  calls made by th
5ee0: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
5ef0: 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65  to the pagerStre
5f00: 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a  ss() routine to.
5f10: 2a 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65  **   write cache
5f20: 64 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  d data to the fi
5f30: 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64  le-system in ord
5f40: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
5f50: 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57  mory)..**.**   W
5f60: 68 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69  hen doNotSpill i
5f70: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74  s non-zero, writ
5f80: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
5f90: 61 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74  ase from pagerSt
5fa0: 72 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64  ress().**   is d
5fb0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
5fc0: 65 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  er. This is done
5fd0: 20 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75   in a very obscu
5fe0: 72 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  re case that.** 
5ff0: 20 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e    comes up durin
6000: 67 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  g savepoint roll
6010: 62 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72  back that requir
6020: 65 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  es the pcache mo
6030: 64 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c  dule.**   to all
6040: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
6050: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
6070: 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a  m being written.
6080: 2a 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73  **   while it is
6090: 20 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64   being traversed
60a0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65   by code in page
60b0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a  r_playback()..**
60c0: 20 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53   .**   If doNotS
60d0: 79 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d  yncSpill is non-
60e0: 7a 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f  zero, writing to
60f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
6100: 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29  om pagerStress()
6110: 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74  .**   is permitt
6120: 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20  ed, but syncing 
6130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6140: 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c   is not. This fl
6150: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62  ag is set.**   b
6160: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
6170: 69 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66  ite() when the f
6180: 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f  ile-system secto
6190: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
61a0: 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64   than.**   the d
61b0: 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
61c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  e in order to pr
61d0: 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20  event a journal 
61e0: 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e  sync from happen
61f0: 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74  ing .**   in bet
6200: 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ween the journal
6210: 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65  ling of two page
6220: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  s on the same se
6230: 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62  ctor. .**.** sub
6240: 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20  jInMemory.**.** 
6250: 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c    This is a bool
6260: 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66  ean variable. If
6270: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
6280: 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75  required sub-jou
6290: 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65  rnal.**   is ope
62a0: 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
62b0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
62c0: 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e  . If false, then
62d0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20   in-memory.**   
62e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65  sub-journals are
62f0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69   only used for i
6300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66  n-memory pager f
6310: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  iles..**.**   Th
6320: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
6330: 70 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70  pdated by the up
6340: 70 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74  per layer each t
6350: 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20  ime a new .**   
6360: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6370: 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a  n is opened..**.
6380: 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69  ** dbSize, dbOri
6390: 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a  gSize, dbFileSiz
63a0: 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  e.**.**   Variab
63b0: 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74  le dbSize is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
63e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
63f0: 20 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69     It is valid i
6400: 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61  n PAGER_READER a
6410: 6e 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73  nd higher states
6420: 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63   (all states exc
6430: 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45  ept for.**   OPE
6440: 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a  N and ERROR). .*
6450: 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73  *.**   dbSize is
6460: 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
6470: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6480: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
6490: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20  ch may be .**   
64a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
64b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
64c0: 62 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20  base (the value 
64d0: 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74  stored at offset
64e0: 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20  .**   28 of the 
64f0: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
6500: 62 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49  by the btree). I
6510: 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
6520: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e  e file.**   is n
6530: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
6540: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
6550: 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c  ge-size, the val
6560: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
6570: 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e    dbSize is roun
6580: 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61  ded down (i.e. a
6590: 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   5KB file with 2
65a0: 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20  K page-size has 
65b0: 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20  dbSize==2)..**  
65c0: 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
65d0: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
65e0: 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
65f0: 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
6600: 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76  ered.**   to hav
6610: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  e at least one p
6620: 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42  age. (i.e. a 1KB
6630: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6640: 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a  ge-size leads.**
6650: 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29     to dbSize==1)
6660: 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67  ..**.**   During
6670: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
6680: 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77  tion, if pages w
6690: 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ith page-numbers
66a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
66b0: 20 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f     dbSize are mo
66c0: 64 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  dified in the ca
66d0: 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75  che, dbSize is u
66e0: 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
66f0: 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72  ly..**   Similar
6700: 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  ly, if the datab
6710: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
6720: 20 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e   using PagerTrun
6730: 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a  cateImage(), .**
6740: 20 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64     dbSize is upd
6750: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  ated..**.**   Va
6760: 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69  riables dbOrigSi
6770: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
6780: 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73  e are valid in s
6790: 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45  tates .**   PAGE
67a0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
67b0: 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72  and higher. dbOr
67c0: 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79  igSize is a copy
67d0: 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a   of the dbSize.*
67e0: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20  *   variable at 
67f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
6800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
6810: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
6820: 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61  rollback,.**   a
6830: 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  nd to determine 
6840: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  whether or not p
6850: 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
6860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72  journalled befor
6870: 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64  e.**   being mod
6880: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  ified..**.**   T
6890: 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74  hroughout a writ
68a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  e-transaction, d
68b0: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
68c0: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a  ns the size of.*
68d0: 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  *   the file on 
68e0: 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49  disk in pages. I
68f0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  t is set to a co
6900: 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65  py of dbSize whe
6910: 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65  n the.**   write
6920: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
6930: 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e  first opened, an
6940: 64 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56  d updated when V
6950: 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  FS calls are mad
6960: 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20  e.**   to write 
6970: 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
6990: 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20   disk. .**.**   
69a0: 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
69b0: 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20 76  the dbFileSize v
69c0: 61 72 69 61 62 6c 65 20 69 73 20 72 65 71 75 69  ariable is requi
69d0: 72 65 64 20 69 73 20 74 6f 20 73 75 70 70 72 65  red is to suppre
69e0: 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73  ss .**   unneces
69f0: 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20 78 54  sary calls to xT
6a00: 72 75 6e 63 61 74 65 28 29 20 61 66 74 65 72 20  runcate() after 
6a10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
6a20: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a  nsaction. If, .*
6a30: 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61 6e 73  *   when a trans
6a40: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
6a50: 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c 65 53  ted, the dbFileS
6a60: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 6e 64  ize variable ind
6a70: 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74 68 61  icates .**   tha
6a80: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
6a90: 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ile is larger th
6aa0: 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
6ab0: 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64 62 53  image (Pager.dbS
6ac0: 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65  ize), .**   page
6ad0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6ae0: 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61 67 65  called. The page
6af0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c  r_truncate() cal
6b00: 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69 7a 65  l uses xFilesize
6b10: 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75  ().**   to measu
6b20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
6b30: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e  file on disk, an
6b40: 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 73  d then truncates
6b50: 20 69 74 20 69 66 20 72 65 71 75 69 72 65 64 2e   it if required.
6b60: 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69 7a 65  .**   dbFileSize
6b70: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77 68 65   is not used whe
6b80: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
6b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
6ba0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 20 20   this case.**   
6bb0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6bc0: 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e   is called uncon
6bd0: 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63  ditionally (whic
6be0: 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20 6d 61  h means there ma
6bf0: 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c  y be.**   a call
6c00: 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28 29 20   to xFilesize() 
6c10: 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74 72 69  that is not stri
6c20: 63 74 6c 79 20 72 65 71 75 69 72 65 64 29 2e 20  ctly required). 
6c30: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 0a  In either case,.
6c40: 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  **   pager_trunc
6c50: 61 74 65 28 29 20 6d 61 79 20 63 61 75 73 65 20  ate() may cause 
6c60: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 63 6f  the file to beco
6c70: 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61  me smaller or la
6c80: 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69  rger..**.** dbHi
6c90: 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntSize.**.**   T
6ca0: 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20 76 61  he dbHintSize va
6cb0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
6cc0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
6cd0: 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65  er of calls made
6ce0: 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56 46 53   to.**   the VFS
6cf0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43   xFileControl(FC
6d00: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d  NTL_SIZE_HINT) m
6d10: 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ethod. .**.**   
6d20: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 73 65  dbHintSize is se
6d30: 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  t to a copy of t
6d40: 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62  he dbSize variab
6d50: 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77  le when a.**   w
6d60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6d70: 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74 20 74   is opened (at t
6d80: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
6d90: 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a  dbFileSize and.*
6da0: 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65 29 2e  *   dbOrigSize).
6db0: 20 49 66 20 74 68 65 20 78 46 69 6c 65 43 6f 6e   If the xFileCon
6dc0: 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f  trol(FCNTL_SIZE_
6dd0: 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69 73 20  HINT) method is 
6de0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48  called,.**   dbH
6df0: 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63 72 65  intSize is incre
6e00: 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75 6d 62  ased to the numb
6e10: 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
6e20: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
6e30: 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e  he.**   size-hin
6e40: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
6e50: 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65  method call. See
6e60: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
6e70: 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20  elist() for .** 
6e80: 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a    details..**.**
6e90: 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20   errCode.**.**  
6ea0: 20 54 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   The Pager.errCo
6eb0: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6f  de variable is o
6ec0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 69 6e  nly ever used in
6ed0: 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
6ee0: 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73 20 73  te. It.**   is s
6ef0: 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c  et to zero in al
6f00: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 2e 20  l other states. 
6f10: 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  In PAGER_ERROR s
6f20: 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72 72 43  tate, Pager.errC
6f30: 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77  ode .**   is alw
6f40: 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54  ays set to SQLIT
6f50: 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
6f60: 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
6f70: 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  he SQLITE_IOERR_
6f80: 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f  XXX .**   sub-co
6f90: 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  des..*/.struct P
6fa0: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
6fb0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
6fc0: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
6fd0: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
6fe0: 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75  IO */.  u8 exclu
6ff0: 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  siveMode;       
7000: 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20      /* Boolean. 
7010: 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f  True if locking_
7020: 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20  mode==EXCLUSIVE 
7030: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d  */.  u8 journalM
7040: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7050: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
7060: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
7070: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  _* values */.  u
7080: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
70a0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
70b0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
70c0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  e */.  u8 noSync
70d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
70e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
70f0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
7100: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
7110: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
7120: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
7130: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
7140: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
7150: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 63  stness */.  u8 c
7160: 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  kptSyncFlags;   
7170: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
7180: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
7190: 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70 6f 69  ULL for checkpoi
71a0: 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79  nt */.  u8 walSy
71b0: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
71c0: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
71d0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
71e0: 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73 20 2a  for wal writes *
71f0: 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73  /.  u8 syncFlags
7200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7210: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
7220: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65  r SYNC_FULL othe
7230: 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65  rwise */.  u8 te
7240: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7250: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7260: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7270: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7280: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72a0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
72b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
72c0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
72e0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
72f0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
7300: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7350: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7360: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7370: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7380: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7390: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
73a0: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
73b0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
73c0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
73d0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
73e0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
73f0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
7400: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7410: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7420: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7430: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7440: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7450: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7460: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7470: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7480: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7490: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
74a0: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
74b0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
74c0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
74d0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
74e0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
74f0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
7500: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7510: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7520: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7530: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7550: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7560: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7570: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7580: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
75a0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
75b0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
75c0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
75d0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
75e0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
75f0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7600: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7610: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7630: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7640: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7650: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7660: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7670: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7680: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7690: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
76a0: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
76b0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
76c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76d0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
76e0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
76f0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
7700: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7710: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7720: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7730: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7740: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7760: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7770: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7780: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7790: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
77a0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
77b0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
77c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
77d0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7800: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7810: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7820: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7830: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7840: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7850: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7860: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7880: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7890: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
78a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
78d0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
78e0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
78f0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7900: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7910: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7920: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7930: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7940: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7950: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7970: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7980: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7990: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
79a0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
79b0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
79c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
79d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
79e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79f0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7a00: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a10: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7a20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7a30: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7a40: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7a50: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7a60: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7a70: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7a80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7a90: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7aa0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ab0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7ad0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7ae0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7af0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7b00: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7b10: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7b20: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7b30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7b50: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7b60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7b70: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7b80: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7b90: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7ba0: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7bb0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7bc0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7bd0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7be0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7bf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7c00: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7c10: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7c20: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7c30: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7c40: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7c50: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7c60: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
7c70: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
7c80: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
7c90: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
7ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ce0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
7cf0: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
7d00: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
7d10: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
7d20: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
7d30: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
7d40: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
7d50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7d60: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
7d70: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
7d80: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
7d90: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
7da0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
7db0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
7dc0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
7dd0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
7de0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
7df0: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
7e00: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
7e10: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7e30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7e40: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
7e50: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e70: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
7e80: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
7e90: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
7ea0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
7eb0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
7ec0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
7ed0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
7ee0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
7ef0: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
7f00: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7f10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7f20: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
7f30: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
7f40: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
7f50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7f60: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
7f70: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
7f80: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
7f90: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
7fa0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
7fb0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
7fc0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
7fd0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
7fe0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
7ff0: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8000: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8010: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e   hits, misses an
8020: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
8030: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
8040: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8060: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
8070: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
8080: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
8090: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
80a0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
80b0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
80c0: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
80d0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
80e0: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
80f0: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
8100: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
8110: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
8120: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
8130: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
8140: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
8150: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
8160: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
8170: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
8180: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
8190: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
81a0: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
81b0: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
81c0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
81e0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
81f0: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
8200: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
8210: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
8220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8230: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
8240: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
8250: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50  r tmp use */.  P
8260: 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20  Cache *pPCache; 
8270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
8280: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61  inter to page ca
8290: 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69  che object */.#i
82a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
82b0: 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61  T_WAL.  Wal *pWa
82c0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
82d0: 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65      /* Write-ahe
82e0: 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22  ad log used by "
82f0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
8300: 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61  " */.  char *zWa
8310: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8320: 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
8330: 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20  for write-ahead 
8340: 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  log */.#endif.};
8350: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20  ../*.** Indexes 
8360: 66 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67  for use with Pag
8370: 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20  er.aStat[]. The 
8380: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72  Pager.aStat[] ar
8390: 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ray contains.** 
83a0: 74 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73  the values acces
83b0: 73 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53  sed by passing S
83c0: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
83d0: 41 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f  ACHE_HIT, CACHE_
83e0: 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48  MISS .** or CACH
83f0: 45 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74  E_WRITE to sqlit
8400: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a  e3_db_status()..
8410: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
8420: 5f 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64  _STAT_HIT   0.#d
8430: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
8440: 5f 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65  _MISS  1.#define
8450: 20 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54   PAGER_STAT_WRIT
8460: 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  E 2../*.** The f
8470: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
8480: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
8490: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
84a0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
84b0: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
84c0: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
84d0: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
84e0: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
84f0: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
8500: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
8510: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
8520: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
8530: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
8540: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
8550: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
8560: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
8570: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
8580: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
8590: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
85a0: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
85b0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
85c0: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
85d0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
85e0: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
85f0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
8600: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
8610: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
8620: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
8630: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
8640: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
8650: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
8660: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
8670: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
8680: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
8690: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
86a0: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
86b0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
86c0: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
86d0: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
86e0: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
86f0: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
8700: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
8710: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
8720: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
8730: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
8740: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
8750: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
8760: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
8770: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
8780: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
8790: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
87a0: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
87b0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
87c0: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
87d0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
87e0: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
87f0: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
8800: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
8810: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
8820: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
8830: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
8840: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
8850: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
8860: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
8870: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
8880: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
8890: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
88a0: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
88b0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
88c0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
88d0: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
88e0: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
88f0: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
8900: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
8910: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
8920: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
8930: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
8940: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
8950: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
8960: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
8970: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
8980: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
8990: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
89a0: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
89b0: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
89c0: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
89d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
89e0: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
89f0: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
8a00: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
8a10: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
8a20: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
8a30: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
8a40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
8a50: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
8a60: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
8a70: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
8a80: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
8a90: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
8aa0: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
8ab0: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
8ac0: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
8ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
8ae0: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
8af0: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
8b00: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
8b10: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
8b20: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
8b30: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
8b40: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
8b50: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
8b60: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
8b70: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
8b80: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
8b90: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
8ba0: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
8bb0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
8bc0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
8bd0: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
8be0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8bf0: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
8c00: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
8c10: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
8c20: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
8c30: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
8c40: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
8c50: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
8c60: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
8c70: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
8c80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
8c90: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
8ca0: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
8cb0: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
8cc0: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
8cd0: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
8ce0: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
8cf0: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
8d00: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
8d10: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
8d20: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
8d30: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
8d40: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
8d50: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
8d60: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
8d70: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
8d80: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
8d90: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
8da0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
8db0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
8dc0: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
8dd0: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
8de0: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
8df0: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
8e00: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
8e10: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
8e20: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
8e30: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
8e40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
8e50: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
8e60: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
8e70: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
8e80: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
8e90: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
8ea0: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
8eb0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
8ec0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
8ed0: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
8ee0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
8ef0: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
8f00: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
8f10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
8f20: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
8f30: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
8f40: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
8f50: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
8f60: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
8f70: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
8f80: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
8f90: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
8fa0: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
8fb0: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
8fc0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
8fd0: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
8fe0: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
8ff0: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
9000: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
9010: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
9020: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
9030: 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ods)../*.** Retu
9040: 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20  rn true if this 
9050: 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72 69  pager uses a wri
9060: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e 73  te-ahead log ins
9070: 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
9080: 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  l.** rollback jo
9090: 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73 65  urnal. Otherwise
90a0: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64   false..*/.#ifnd
90b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
90c0: 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  AL.static int pa
90d0: 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72 20  gerUseWal(Pager 
90e0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
90f0: 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  rn (pPager->pWal
9100: 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  !=0);.}.#else.# 
9110: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
9120: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9130: 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
9140: 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20  l(x) 0.# define 
9150: 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76  pagerWalFrames(v
9160: 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69  ,w,x,y) 0.# defi
9170: 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  ne pagerOpenWalI
9180: 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49  fPresent(z) SQLI
9190: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70  TE_OK.# define p
91a0: 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
91b0: 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49  nsaction(z) SQLI
91c0: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69  TE_OK.#endif..#i
91d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a  fndef NDEBUG ./*
91e0: 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  .** Usage:.**.**
91f0: 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
9200: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
9210: 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54  ager) );.**.** T
9220: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e  his function run
9230: 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74  s many asserts t
9240: 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e  o try to find in
9250: 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e  consistencies in
9260: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  .** the internal
9270: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
9280: 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ger object..*/.s
9290: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
92a0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
92b0: 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20  er *p){.  Pager 
92c0: 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20  *pPager = p;..  
92d0: 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65  /* State must be
92e0: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73   valid. */.  ass
92f0: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d  ert( p->eState==
9300: 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20  PAGER_OPEN.     
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 52 45 41 44 45 52 0a 20 20 20  PAGER_READER.   
9330: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9340: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
9350: 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
9360: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9370: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
9380: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9390: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
93a0: 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20  ER_DBMOD.       
93b0: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
93c0: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
93d0: 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  HED.       || p-
93e0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
93f0: 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  RROR.  );..  /* 
9400: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
9410: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c  e current state,
9420: 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e   a temp-file con
9430: 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62  nection always b
9440: 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69  ehaves.  ** as i
9450: 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c  f it has an excl
9460: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
9470: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9480: 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65   It never update
9490: 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67  s.  ** the chang
94a0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c  e-counter field,
94b0: 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f   so the changeCo
94c0: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
94d0: 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f  always set..  */
94e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
94f0: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e  mpFile==0 || p->
9500: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
9510: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
9520: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
9530: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
9540: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
9550: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
9560: 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20  Journal flag is 
9570: 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e  clear, the journ
9580: 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20  al-mode must be 
9590: 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64  "OFF". .  ** And
95a0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   if the journal-
95b0: 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74  mode is "OFF", t
95c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
95d0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e  must not be open
95e0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
95f0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9600: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9610: 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65  DE_OFF || p->use
9620: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
9630: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9640: 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
9650: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69  ALMODE_OFF || !i
9660: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b  sOpen(p->jfd) );
9670: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
9680: 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20  t MEMDB implies 
9690: 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69  noSync. And an i
96a0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
96b0: 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68  . Since .  ** th
96c0: 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d  is means an in-m
96d0: 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66  emory pager perf
96e0: 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c  orms no IO at al
96f0: 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63  l, it cannot enc
9700: 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74  ounter .  ** eit
9710: 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  her SQLITE_IOERR
9720: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   or SQLITE_FULL 
9730: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
9740: 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a  or while finaliz
9750: 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72  ing .  ** a jour
9760: 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f  nal file. (altho
9770: 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ugh the in-memor
9780: 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d  y journal implem
9790: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20  entation may .  
97a0: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
97b0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69  _IOERR_NOMEM whi
97c0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  le the journal f
97d0: 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69  ile is being wri
97e0: 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20  tten). It .  ** 
97f0: 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74  is therefore not
9800: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e   possible for an
9810: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
9820: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
9830: 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e  ROR .  ** state.
9840: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
9850: 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
9860: 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20   p->noSync );.  
9870: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9880: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9890: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
98a0: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  .         || p->
98b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
98c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
98d0: 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20  EMORY .    );.  
98e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
98f0: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
9900: 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50   && p->eState!=P
9910: 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
9920: 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
9930: 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20  eWal(p)==0 );.  
9940: 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67  }..  /* If chang
9950: 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65  eCountDone is se
9960: 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  t, a RESERVED lo
9970: 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
9980: 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20  st be held.  ** 
9990: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  on the file..  *
99a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
99b0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
99c0: 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  one==0 || pPager
99d0: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
99e0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
99f0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45  rt( p->eLock!=PE
9a00: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  NDING_LOCK );.. 
9a10: 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61   switch( p->eSta
9a20: 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  te ){.    case P
9a30: 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20  AGER_OPEN:.     
9a40: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
9a50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9a60: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9a70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9a80: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
9a90: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
9aa0: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
9ab0: 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  he)==0 || pPager
9ac0: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
9ad0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9ae0: 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45  case PAGER_READE
9af0: 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  R:.      assert(
9b00: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9b10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9b20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9b30: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
9b40: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
9b50: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53  ert( p->eLock>=S
9b60: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
9b70: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9b80: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
9b90: 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20  R_LOCKED:.      
9ba0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9bb0: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
9bc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9bd0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
9be0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9bf0: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73      if( !pagerUs
9c00: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
9c10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9c20: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
9c30: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
9c40: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9c50: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
9c60: 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
9c70: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9c80: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9c90: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9ca0: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
9cb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9cc0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9cd0: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
9ce0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9cf0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74  ert( pPager->set
9d00: 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Master==0 );.   
9d10: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
9d20: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
9d30: 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20  _CACHEMOD:.     
9d40: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9d50: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9d60: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9d70: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9d80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9d90: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
9da0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
9db0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69  .        /* It i
9dc0: 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
9dd0: 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  if journal_mode=
9de0: 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65  wal here that ne
9df0: 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20 20  ither the.      
9e00: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
9e10: 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69  e nor the WAL fi
9e20: 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69  le are open. Thi
9e30: 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67  s happens during
9e40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f  .        ** a ro
9e50: 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69  llback transacti
9e60: 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65 73  on that switches
9e70: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   from journal_mo
9e80: 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20 2a  de=off.        *
9e90: 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  * to journal_mod
9ea0: 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a  e=wal..        *
9eb0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
9ec0: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ( p->eLock>=RESE
9ed0: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RVED_LOCK );.   
9ee0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
9ef0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
9f00: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
9f10: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9f20: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9f30: 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  FF .            
9f40: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
9f50: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9f60: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
9f70: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
9f80: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9f90: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
9fa0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
9fb0: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
9fc0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
9fd0: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
9fe0: 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20  dbHintSize );.  
9ff0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a000: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a010: 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61  R_DBMOD:.      a
a020: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a030: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a040: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a050: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a060: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a070: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a080: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a090: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a0a0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43  t( p->eLock>=EXC
a0b0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a0c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
a0d0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
a0e0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a0f0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a100: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
a110: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
a120: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a130: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a140: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
a150: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a160: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a170: 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  <=pPager->dbHint
a180: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a190: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a1a0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
a1b0: 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  SHED:.      asse
a1c0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  rt( p->eLock==EX
a1d0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a1e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a1f0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a200: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a210: 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
a220: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a230: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a240: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a250: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a260: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a270: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a280: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a290: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a2a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a2b0: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a2c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a2d0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a2e0: 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20  ERROR:.      /* 
a2f0: 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74  There must be at
a300: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
a310: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
a320: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69 66   to the pager if
a330: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52 52  .      ** in ERR
a340: 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  OR state. Otherw
a350: 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73 68  ise the pager sh
a360: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
a370: 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20  y dropped.      
a380: 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20  ** back to OPEN 
a390: 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
a3a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a3b0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
a3c0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a3d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a3e0: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
a3f0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
a400: 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  >0 );.      brea
a410: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
a420: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
a430: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
a440: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a450: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
a460: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
a470: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
a480: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
a490: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
a4a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
a4b0: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
a4c0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
a4d0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
a4e0: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
a4f0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
a500: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
a510: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
a520: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
a530: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
a540: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
a550: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
a560: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
a570: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
a580: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
a590: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
a5a0: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
a5b0: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
a5c0: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
a5d0: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
a5e0: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
a5f0: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
a600: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
a610: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
a620: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
a630: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
a640: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
a650: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
a660: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
a670: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
a680: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
a690: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
a6a0: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
a6b0: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
a6c0: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
a6d0: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
a6e0: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
a6f0: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
a700: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
a710: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
a720: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
a730: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
a740: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
a750: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
a760: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
a770: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
a780: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
a790: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
a7a0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
a7b0: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
a7c0: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
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 4c 4f 43 4b 45  GER_WRITER_LOCKE
a7f0: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
a800: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
a810: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
a820: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
a830: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
a840: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
a850: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a860: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
a870: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
a880: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a890: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
a8a0: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
a8b0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
a8c0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
a8d0: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
a8e0: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
a8f0: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
a900: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
a910: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
a920: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
a930: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
a940: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
a950: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
a960: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
a970: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
a980: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
a990: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
a9a0: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
a9b0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
a9c0: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
a9d0: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
a9e0: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
a9f0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
aa00: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
aa10: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
aa20: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
aa30: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
aa40: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
aa50: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aa60: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aa70: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
aa80: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
aa90: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aaa0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aab0: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
aac0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
aad0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
aae0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
aaf0: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
ab00: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
ab10: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ab20: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
ab30: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
ab40: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
ab50: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ab60: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
ab70: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
ab80: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
ab90: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
aba0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
abb0: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
abc0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
abd0: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
abe0: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
abf0: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
ac00: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
ac10: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
ac20: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
ac30: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
ac40: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
ac50: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
ac60: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
ac70: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
ac80: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t;.}.#endif../*.
ac90: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
aca0: 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  f it is necessar
acb0: 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65 20  y to write page 
acc0: 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75  *pPg into the su
acd0: 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20  b-journal..** A 
ace0: 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
acf0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
ad00: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
ad10: 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e   there exists on
ad20: 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65  e.** or more ope
ad30: 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72  n savepoints for
ad40: 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20   which:.**.**   
ad50: 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  * The page-numbe
ad60: 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  r is less than o
ad70: 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72  r equal to Pager
ad80: 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c  Savepoint.nOrig,
ad90: 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
ada0: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
adb0: 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75  g to the page-nu
adc0: 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20  mber is not set 
add0: 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  in.**     PagerS
ade0: 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
adf0: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
ae00: 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65   int subjRequire
ae10: 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  sPage(PgHdr *pPg
ae20: 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  ){.  Pgno pgno =
ae30: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61   pPg->pgno;.  Pa
ae40: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
ae50: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
ae60: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
ae70: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
ae80: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  int; i++){.    P
ae90: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
aea0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
aeb0: 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  epoint[i];.    i
aec0: 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e  f( p->nOrig>=pgn
aed0: 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42  o && 0==sqlite3B
aee0: 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e  itvecTest(p->pIn
aef0: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
af00: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
af10: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
af20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
af30: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
af40: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
af50: 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
af60: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  rnal file..*/.st
af70: 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a  atic int pageInJ
af80: 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50  ournal(PgHdr *pP
af90: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
afa0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
afb0: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Pg->pPager->pInJ
afc0: 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
afd0: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  o);.}../*.** Rea
afe0: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
aff0: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
b000: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
b010: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
b020: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
b030: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
b040: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b050: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
b060: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
b070: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
b080: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
b090: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
b0a0: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
b0b0: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
b0c0: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
b0d0: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
b0e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b0f0: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b100: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
b110: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
b120: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
b130: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
b140: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f  c, sizeof(ac), o
b150: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
b160: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b170: 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74     *pRes = sqlit
b180: 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a  e3Get4byte(ac);.
b190: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b1a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
b1b0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b1c0: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
b1d0: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
b1e0: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
b1f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32  */.#define put32
b200: 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74  bits(A,B)  sqlit
b210: 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29  e3Put4byte((u8*)
b220: 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  A,B).../*.** Wri
b230: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
b240: 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76  ger into the giv
b250: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
b260: 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  or.  Return SQLI
b270: 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
b280: 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
b290: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
b2a0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
b2b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
b2c0: 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  e32bits(sqlite3_
b2d0: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
b2e0: 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a  fset, u32 val){.
b2f0: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
b300: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
b310: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
b320: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
b330: 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a  ac, 4, offset);.
b340: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
b350: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b360: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
b370: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
b380: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a  either NO_LOCK.*
b390: 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  * or SHARED_LOCK
b3a0: 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
b3b0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b3c0: 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f  he call to xUnlo
b3d0: 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73  ck().** succeeds
b3e0: 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
b3f0: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
b400: 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61 74 74  o match the (att
b410: 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b  empted) new lock
b420: 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
b430: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b440: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b450: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b460: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63  function is.** c
b470: 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f  alled, do not mo
b480: 64 69 66 79 20 69 74 2e 20 53 65 65 20 74 68 65  dify it. See the
b490: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
b4a0: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a  he #define of .*
b4b0: 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  * UNKNOWN_LOCK f
b4c0: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
b4d0: 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  n of this..*/.st
b4e0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
b4f0: 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  lockDb(Pager *pP
b500: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
b510: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b520: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
b530: 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  t( !pPager->excl
b540: 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
b550: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63  ger->eLock==eLoc
b560: 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  k );.  assert( e
b570: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
b580: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
b590: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
b5a0: 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20   eLock!=NO_LOCK 
b5b0: 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
b5c0: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69  Pager)==0 );.  i
b5d0: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
b5e0: 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
b5f0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
b600: 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck>=eLock );.   
b610: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55   rc = sqlite3OsU
b620: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
b630: 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , eLock);.    if
b640: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21  ( pPager->eLock!
b650: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b  =UNKNOWN_LOCK ){
b660: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
b670: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
b680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
b690: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20  ACE(("UNLOCK %p 
b6a0: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65  %d\n", pPager, e
b6b0: 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74  Lock)).  }.  ret
b6c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b6d0: 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   Lock the databa
b6e0: 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c  se file to level
b6f0: 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75   eLock, which mu
b700: 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41  st be either SHA
b710: 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53  RED_LOCK,.** RES
b720: 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58  ERVED_LOCK or EX
b730: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66  CLUSIVE_LOCK. If
b740: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73   the caller is s
b750: 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
b760: 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  he.** Pager.eLoc
b770: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68  k variable to th
b780: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
b790: 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ate. .**.** Exce
b7a0: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
b7b0: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
b7c0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
b7d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b7e0: 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e  .** called, do n
b7f0: 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c  ot modify it unl
b800: 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b  ess the new lock
b810: 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43  ing state is EXC
b820: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a  LUSIVE_LOCK. .**
b830: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
b840: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
b850: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
b860: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
b870: 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69  ation .** of thi
b880: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
b890: 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67   pagerLockDb(Pag
b8a0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
b8b0: 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
b8c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
b8d0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
b8e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SHARED_LOCK || e
b8f0: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
b900: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58  OCK || eLock==EX
b910: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
b920: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
b930: 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61  ock<eLock || pPa
b940: 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
b950: 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  OWN_LOCK ){.    
b960: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
b970: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65  ck(pPager->fd, e
b980: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  Lock);.    if( r
b990: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
b9a0: 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d  (pPager->eLock!=
b9b0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c  UNKNOWN_LOCK||eL
b9c0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
b9d0: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50  OCK) ){.      pP
b9e0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
b9f0: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49  8)eLock;.      I
ba00: 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
ba10: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
ba20: 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20  eLock)).    }.  
ba30: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
ba40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
ba50: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
ba60: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
ba70: 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
ba80: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
ba90: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
baa0: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
bab0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
bac0: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
bad0: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
bae0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
baf0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
bb00: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
bb10: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
bb20: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
bb30: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
bb40: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
bb50: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
bb60: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
bb70: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
bb80: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
bb90: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
bba0: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
bbb0: 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  ** The optimizat
bbc0: 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61  ion is also alwa
bbd0: 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  ys enabled for t
bbe0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
bbf0: 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  It is.** an erro
bc00: 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  r to call this f
bc10: 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65  unction if pPage
bc20: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r is opened on a
bc30: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
bc40: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
bc50: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
bc60: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  on cannot be use
bc70: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
bc80: 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  . If it can be u
bc90: 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sed,.** then the
bca0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
bcb0: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
bcc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
bcd0: 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61  when it.** conta
bce0: 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74  ins rollback dat
bcf0: 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e  a for exactly on
bd00: 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  e page..*/.#ifde
bd10: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
bd20: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61  ATOMIC_WRITE.sta
bd30: 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66  tic int jrnlBuff
bd40: 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  erSize(Pager *pP
bd50: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
bd60: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
bd70: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
bd80: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63  le ){.    int dc
bd90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
bdb0: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
bdc0: 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74  stics */.    int
bdd0: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20   nSector;       
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bdf0: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
be00: 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b  .    int szPage;
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
be30: 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ize */..    asse
be40: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
be50: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63  r->fd) );.    dc
be60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
be70: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
be80: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
be90: 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61     nSector = pPa
bea0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
beb0: 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50  .    szPage = pP
bec0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
bed0: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
bee0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
bef0: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
bf00: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
bf10: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
bf20: 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
bf30: 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53     if( 0==(dc&(S
bf40: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
bf50: 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20  IC|(szPage>>8)) 
bf60: 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67  || nSector>szPag
bf70: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
bf80: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
bf90: 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41  .  return JOURNA
bfa0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
bfb0: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
bfc0: 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64  (pPager);.}.#end
bfd0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  if../*.** If SQL
bfe0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
bff0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
c000: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
c010: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
c020: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
c030: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
c040: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
c050: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
c060: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
c070: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
c080: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
c090: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
c0a0: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
c0b0: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
c0c0: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
c0d0: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
c0e0: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
c0f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
c100: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
c110: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
c120: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
c130: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
c140: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
c150: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
c160: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
c170: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
c180: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
c190: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
c1a0: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
c1b0: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
c1c0: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
c1d0: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
c1e0: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
c1f0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
c200: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
c210: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
c220: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
c230: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
c240: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
c250: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
c260: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
c270: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
c280: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
c290: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
c2a0: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
c2b0: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
c2c0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
c2d0: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
c2e0: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
c2f0: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
c300: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
c310: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
c320: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
c330: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
c340: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
c350: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
c360: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
c370: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
c380: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
c390: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
c3a0: 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
c3b0: 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
c3c0: 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
c3d0: 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
c3e0: 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68  || pPg->pageHash
c3f0: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
c400: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
c410: 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  e.#define pager_
c420: 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30  datahash(X,Y)  0
c430: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70  .#define pager_p
c440: 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64  agehash(X)  0.#d
c450: 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f  efine pager_set_
c460: 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65 66  pagehash(X).#def
c470: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
c480: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
c490: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
c4a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
c4b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
c4c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
c4d0: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
c4e0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
c4f0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
c500: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
c510: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
c520: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
c530: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
c540: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
c550: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
c560: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
c570: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
c580: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
c590: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
c5a0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
c5b0: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
c5c0: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
c5d0: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
c5e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c5f0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
c600: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
c610: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
c620: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
c630: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
c640: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
c650: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
c660: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
c670: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
c680: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
c690: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
c6a0: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
c6b0: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
c6c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c6d0: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
c6e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
c6f0: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
c700: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
c710: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
c720: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
c730: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
c740: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
c750: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
c760: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
c770: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
c780: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
c790: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
c7a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c7b0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
c7c0: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
c7d0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
c7e0: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
c7f0: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
c800: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
c810: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
c820: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
c830: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
c840: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
c850: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
c860: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
c870: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
c880: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
c890: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
c8a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c8b0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
c8c0: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
c8d0: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
c8e0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
c8f0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
c900: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
c910: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
c920: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
c930: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
c940: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
c950: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
c960: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
c970: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
c980: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
c990: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
c9a0: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
c9b0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
c9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
c9d0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
c9e0: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
c9f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
ca00: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
ca10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
ca20: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
ca50: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
ca60: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
ca70: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
caa0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
cab0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
cac0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
cad0: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
cae0: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
caf0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
cb00: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
cb10: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
cb20: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
cb30: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
cb40: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
cb50: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
cb60: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
cb70: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
cb80: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
cb90: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
cba0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
cbb0: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
cbc0: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
cbd0: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
cbe0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cbf0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cc00: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
cc10: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
cc20: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
cc30: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
cc40: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
cc50: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
cc60: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
cc70: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
cc80: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cc90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
cca0: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
ccb0: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
ccc0: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
ccd0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
cce0: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
ccf0: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
cd00: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cd10: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
cd20: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
cd30: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
cd40: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
cd50: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
cd60: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
cd70: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
cd80: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
cd90: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
cda0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
cdb0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
cdc0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cdd0: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
cde0: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
cdf0: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
ce00: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
ce10: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
ce20: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
ce30: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
ce40: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
ce50: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
ce60: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
ce70: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
ce80: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
ce90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ceb0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
cec0: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
ced0: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
cee0: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
cef0: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
cf00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cf10: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
cf20: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
cf30: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
cf40: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
cf50: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
cf60: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
cf70: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
cf80: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
cf90: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
cfa0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
cfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
cfd0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
cfe0: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
cff0: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
d000: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
d010: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
d030: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d050: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
d060: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
d070: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
d080: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
d090: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
d0a0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
d0b0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
d0c0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
d0d0: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
d0e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d0f0: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
d100: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
d110: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
d120: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
d130: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
d140: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
d150: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
d160: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
d170: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d180: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
d190: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
d1a0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
d1b0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
d1c0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
d1d0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
d1e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d1f0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
d200: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d210: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
d220: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
d230: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
d240: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
d250: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
d260: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
d270: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
d280: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
d290: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d2a0: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
d2b0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
d2c0: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
d2d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
d2e0: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
d2f0: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
d300: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
d310: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
d320: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
d330: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
d340: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
d350: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
d360: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
d370: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
d380: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
d390: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
d3a0: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
d3b0: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
d3c0: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
d3d0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
d3e0: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
d3f0: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
d400: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
d410: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
d420: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
d430: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
d440: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
d450: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
d460: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
d470: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
d480: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
d490: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
d4a0: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
d4b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
d4c0: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
d4d0: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
d4e0: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
d4f0: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
d500: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
d510: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
d520: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
d530: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
d540: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
d550: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
d560: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
d570: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
d580: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
d590: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
d5a0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
d5b0: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
d5c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d5f0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
d600: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
d610: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
d620: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
d630: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
d640: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
d650: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
d660: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
d670: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
d680: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
d690: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
d6a0: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
d6b0: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
d6c0: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
d6d0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
d6e0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
d6f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
d700: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d710: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
d720: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
d730: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
d740: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
d750: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
d760: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
d770: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
d780: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
d790: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
d7a0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
d7b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d7c0: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
d7d0: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
d7e0: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
d7f0: 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
d800: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
d810: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
d820: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
d830: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
d840: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
d850: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
d860: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
d870: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
d880: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
d890: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
d8a0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
d8b0: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
d8c0: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
d8d0: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
d8e0: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
d8f0: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
d900: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
d910: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
d920: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
d930: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
d940: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
d950: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
d960: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
d970: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
d980: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
d990: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
d9a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
d9b0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
d9c0: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
d9d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d9e0: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
d9f0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
da00: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
da10: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
da20: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
da30: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
da40: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
da50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
da60: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
da70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
da80: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
da90: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
daa0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
dab0: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
dac0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
dad0: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
dae0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
daf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
db00: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
db10: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
db20: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
db30: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
db40: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
db50: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
db60: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
db70: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
db80: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
db90: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
dba0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
dbb0: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
dbc0: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
dbd0: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
dbe0: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
dbf0: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
dc00: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
dc10: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
dc20: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
dc30: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
dc40: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
dc50: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
dc60: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
dc70: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
dc80: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
dc90: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
dca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dcb0: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
dcc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
dcd0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
dce0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
dcf0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
dd00: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
dd10: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
dd20: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
dd30: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
dd40: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
dd50: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
dd60: 48 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50  Header = (u32)pP
dd70: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f  ager->pageSize;/
dd80: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
dd90: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
dda0: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
ddb0: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
dde0: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
ddf0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
de20: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
de30: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
de40: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
de50: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
de60: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
de70: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
de80: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
de90: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
dea0: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
deb0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
dec0: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
ded0: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
dee0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
def0: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
df00: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
df10: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
df20: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
df30: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
df40: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
df50: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
df60: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
df70: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
df80: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
df90: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
dfa0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
dfb0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
dfc0: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
dfd0: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
dfe0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
dff0: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e000: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e010: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
e020: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
e030: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
e040: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
e050: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
e060: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
e070: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
e080: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
e090: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
e0a0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
e0b0: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
e0c0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
e0d0: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
e0e0: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
e0f0: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
e100: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
e110: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
e120: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e130: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
e140: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
e150: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
e160: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
e170: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
e180: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
e190: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
e1a0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
e1b0: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
e1c0: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
e1d0: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
e1e0: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
e1f0: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
e200: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
e210: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
e220: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
e230: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
e240: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
e250: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
e260: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
e270: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
e280: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
e290: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
e2a0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
e2b0: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
e2c0: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
e2d0: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
e2e0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
e2f0: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
e300: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
e310: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
e320: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
e330: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
e340: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
e350: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
e360: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
e370: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
e380: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
e390: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
e3a0: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
e3b0: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
e3c0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
e3d0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
e3e0: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
e3f0: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
e400: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
e410: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
e420: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
e430: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
e440: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
e450: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
e460: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
e470: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
e480: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  c );.  if( pPage
e490: 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50  r->noSync || (pP
e4a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
e4b0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
e4c0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
e4d0: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
e4e0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
e4f0: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
e500: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e510: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
e520: 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
e530: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
e540: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e550: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75  lMagic));.    pu
e560: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
e570: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e580: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
e590: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
e5a0: 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65     memset(zHeade
e5b0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  r, 0, sizeof(aJo
e5c0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a  urnalMagic)+4);.
e5d0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
e5e0: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
e5f0: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
e600: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
e610: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
e620: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
e630: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
e640: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
e650: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e660: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e670: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
e680: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
e690: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
e6a0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
e6b0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e6c0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e6d0: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
e6e0: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
e6f0: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
e700: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
e710: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
e720: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e730: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e740: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
e750: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
e760: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
e770: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
e780: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e790: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e7a0: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
e7b0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
e7c0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
e7d0: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
e7e0: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
e7f0: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
e800: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
e810: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
e820: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
e830: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
e840: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
e850: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
e860: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
e870: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
e880: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
e890: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
e8a0: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
e8b0: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
e8c0: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
e8d0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e8e0: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
e8f0: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
e900: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e910: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
e920: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
e930: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
e940: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
e950: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
e960: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
e970: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
e980: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e990: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
e9a0: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
e9b0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
e9c0: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
e9d0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
e9e0: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
e9f0: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
ea00: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
ea10: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
ea20: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
ea30: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
ea40: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
ea50: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
ea60: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
ea70: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
ea80: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
ea90: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
eaa0: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
eab0: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
eac0: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
ead0: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
eae0: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
eaf0: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
eb00: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
eb10: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
eb20: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
eb30: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
eb40: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
eb50: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
eb60: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
eb70: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
eb80: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
eb90: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
eba0: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
ebb0: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
ebc0: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
ebd0: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
ebe0: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
ebf0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
ec00: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
ec10: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
ec20: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
ec30: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
ec40: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
ec50: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
ec60: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
ec70: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
ec80: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
ec90: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
eca0: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
ecb0: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
ecc0: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
ecd0: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
ece0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ecf0: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
ed00: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
ed10: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
ed20: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
ed30: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
ed40: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
ed50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ed60: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
ed70: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
ed80: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
ed90: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
eda0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
edb0: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
edc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
edd0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
ede0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
edf0: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
ee00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ee10: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
ee20: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
ee30: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
ee40: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
ee50: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
ee60: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
ee70: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
ee80: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
ee90: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
eea0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
eeb0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
eec0: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
eed0: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
eee0: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
eef0: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
ef00: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
ef10: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
ef20: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
ef30: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
ef40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
ef50: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
ef60: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
ef70: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
ef80: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
ef90: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
efa0: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
efb0: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
efc0: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
efd0: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
efe0: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
eff0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
f000: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
f010: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
f020: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
f030: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
f040: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
f050: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
f060: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f070: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
f080: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
f090: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
f0a0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
f0b0: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
f0c0: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
f0d0: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
f0e0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
f0f0: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
f100: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
f110: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
f120: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
f130: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
f140: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f150: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
f160: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f180: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
f190: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f1b0: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
f1c0: 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20  /.  int isHot,. 
f1d0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
f1e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f1f0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
f200: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
f210: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
f220: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
f230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f240: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
f250: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
f260: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
f270: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
f280: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f290: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
f2a0: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
f2b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2d0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
f2e0: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
f2f0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
f300: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
f310: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
f320: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
f330: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f350: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
f360: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
f370: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
f380: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
f390: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
f3a0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
f3b0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
f3c0: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
f3d0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
f3e0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
f3f0: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
f400: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
f410: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
f420: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
f430: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
f440: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
f450: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
f460: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
f470: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
f480: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
f490: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
f4a0: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
f4b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
f4c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
f4d0: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
f4e0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
f4f0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
f500: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
f510: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
f520: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
f530: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
f540: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f550: 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
f560: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
f570: 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
f580: 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
f590: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
f5a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
f5b0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
f5c0: 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
f5d0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
f5e0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f5f0: 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
f600: 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
f610: 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c  */.  if( isHot |
f620: 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65  | iHdrOff!=pPage
f630: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b  r->journalHdr ){
f640: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f650: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
f660: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
f670: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
f680: 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  rOff);.    if( r
f690: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
f6a0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
f6b0: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
f6c0: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
f6d0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
f6e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
f6f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f710: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
f720: 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
f730: 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
f740: 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
f750: 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
f760: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
f770: 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
f780: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
f790: 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
f7a0: 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
f7b0: 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
f7c0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
f7d0: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
f7e0: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
f7f0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
f800: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
f810: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
f820: 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
f830: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f840: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f850: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f860: 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
f870: 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
f880: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f890: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
f8a0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
f8b0: 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
f8c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
f8d0: 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
f8e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f8f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
f900: 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
f910: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
f920: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
f930: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
f940: 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
f950: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
f960: 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
f970: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
f980: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20   header */..    
f990: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
f9a0: 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
f9b0: 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
f9c0: 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
f9d0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
f9e0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
f9f0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fa00: 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
fa10: 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
fa20: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fa30: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fa40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fa50: 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
fa60: 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
fa70: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fa80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73    }..    /* Vers
fa90: 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
faa0: 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65  rior to 3.5.8 se
fab0: 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
fac0: 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20  field of the.   
fad0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
fae0: 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  er to zero. In t
faf0: 68 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65  his case, assume
fb00: 20 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e   that the Pager.
fb10: 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20  pageSize.    ** 
fb20: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65  variable is alre
fb30: 61 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  ady set to the c
fb40: 6f 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65  orrect page size
fb50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fb60: 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b   iPageSize==0 ){
fb70: 0a 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65  .      iPageSize
fb80: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
fb90: 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
fba0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
fbb0: 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
fbc0: 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
fbd0: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
fbe0: 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
fbf0: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
fc00: 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
fc10: 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
fc20: 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
fc30: 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
fc40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
fc50: 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20  equal to 512 or 
fc60: 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61  32, and not grea
fc70: 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a  ter than their .
fc80: 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76      ** respectiv
fc90: 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d  e compile time m
fca0: 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20  aximum limits.. 
fcb0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
fcc0: 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20  ageSize<512     
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
fce0: 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20  iSectorSize<32. 
fcf0: 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65      || iPageSize
fd00: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
fd10: 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72  _SIZE || iSector
fd20: 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
fd30: 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69  SIZE.     || ((i
fd40: 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
fd50: 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28  eSize)!=0   || (
fd60: 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26  (iSectorSize-1)&
fd70: 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20  iSectorSize)!=0 
fd80: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
fd90: 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74   If the either t
fda0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20  he page-size or 
fdb0: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74  sector-size in t
fdc0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
fdd0: 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  r is .      ** i
fde0: 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65  nvalid, then the
fdf0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
fe00: 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ote the journal-
fe10: 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65  header must have
fe20: 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68   .      ** crash
fe30: 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65  ed before the he
fe40: 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e  ader was synced.
fe50: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74   In this case st
fe60: 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20  op reading .    
fe70: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
fe80: 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
fe90: 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
fea0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
feb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
fec0: 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ate the page-siz
fed0: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
fee0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
fef0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  he journal. .   
ff00: 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61   ** Use a testca
ff10: 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61  se() macro to ma
ff20: 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c  ke sure that mal
ff30: 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68  loc failure with
ff40: 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  in .    ** Pager
ff50: 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73  SetPagesize() is
ff60: 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   tested..    */.
ff70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ff80: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
ff90: 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
ffa0: 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  ize, -1);.    te
ffb0: 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
ffc0: 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
ffd0: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
ffe0: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
fff0: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10000 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20  ue used by .    
10010 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
10020 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
10030 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
10040 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
10050 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
10060 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
10070 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
10080 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10090 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  .    ** is being
100a0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
100b0 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
100c0 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
100d0 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
100e0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
100f0 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
10100 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
10110 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
10120 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
10130 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72  orSize = iSector
10140 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  Size;.  }..  pPa
10150 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10160 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
10170 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  Z(pPager);.  ret
10180 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
10190 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
101a0 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
101b0 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
101c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
101d0 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
101e0 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
101f0 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
10200 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10210 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
10220 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
10230 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
10240 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
10250 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
10260 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
10270 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
10280 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
10290 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
102a0 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
102b0 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
102c0 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
102d0 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
102e0 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  .**.**   + 4 byt
102f0 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
10300 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65  O..**   + N byte
10310 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
10320 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74  l filename in ut
10330 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  f-8..**   + 4 by
10340 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f  tes: N (length o
10350 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
10360 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20   name in bytes, 
10370 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  no nul-terminato
10380 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  r)..**   + 4 byt
10390 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
103a0 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
103b0 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73  ..**   + 8 bytes
103c0 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
103d0 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
103e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
103f0 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
10400 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
10410 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
10420 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c  ** journal name,
10430 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65   where each byte
10440 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
10450 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69  as a signed 8-bi
10460 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  t integer..**.**
10470 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
10480 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
10490 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
104a0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
104b0 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
104c0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
104d0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
104e0 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
104f0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
10500 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
10510 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
10520 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10540 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10550 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20   int nMaster;   
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10570 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
10580 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10590 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105b0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
105c0 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e   header in journ
105d0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
105e0 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20   jrnlSize;      
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10600 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
10610 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f   file on disk */
10620 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
10630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10640 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
10650 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10660 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
10670 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10680 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
10690 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
106a0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
106b0 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c   !zMaster .   ||
106c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
106d0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
106e0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
106f0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
10700 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
10710 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
10720 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
10730 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10740 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
10750 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
10760 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
10770 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73  r->jfd) );.  ass
10780 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
10790 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65  rnalHdr <= pPage
107a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
107b0 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65  ..  /* Calculate
107c0 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62   the length in b
107d0 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65  ytes and the che
107e0 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72  cksum of zMaster
107f0 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65   */.  for(nMaste
10800 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61  r=0; zMaster[nMa
10810 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b  ster]; nMaster++
10820 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
10830 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d  zMaster[nMaster]
10840 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
10850 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
10860 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
10870 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
10880 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
10890 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
108a0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
108b0 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
108c0 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
108d0 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
108e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
108f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
10900 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
10910 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
10920 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
10930 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
10940 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
10950 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48  Pager);.  }.  iH
10960 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
10970 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
10980 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
10990 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20  er journal data 
109a0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
109b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
109c0 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  If.  ** an error
109d0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
109e0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
109f0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
10a00 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28  */.  if( (0 != (
10a10 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10a20 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10a30 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f  drOff, PAGER_MJ_
10a40 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a  PGNO(pPager)))).
10a50 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
10a60 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
10a70 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
10a80 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20  aster, nMaster, 
10a90 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20  iHdrOff+4))).   
10aa0 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
10ab0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
10ac0 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10ad0 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  4+nMaster, nMast
10ae0 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  er))).   || (0 !
10af0 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10b00 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10b10 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10b20 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20  er+4, cksum))). 
10b30 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10b40 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
10b50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
10b60 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69  urnalMagic, 8, i
10b70 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
10b80 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
10b90 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
10ba0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10bb0 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
10bc0 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0);..  /* If the
10bd0 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
10be0 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
10bf0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
10c00 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
10c10 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
10c20 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
10c30 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
10c40 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
10c50 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
10c60 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
10c70 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
10c80 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
10c90 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
10ca0 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
10cb0 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
10cc0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
10cd0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
10ce0 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
10cf0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
10d00 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
10d10 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
10d20 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
10d30 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
10d40 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
10d50 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
10d60 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
10d70 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
10d80 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
10d90 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
10da0 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
10db0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
10dc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
10dd0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
10de0 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
10df0 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
10e00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
10e10 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
10e20 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
10e30 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
10e40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
10e50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10e60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
10e70 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
10e80 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
10e90 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
10ea0 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
10eb0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
10ec0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   or NULL if the 
10ed0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
10ee0 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64  s not .** alread
10ef0 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  y in memory..*/.
10f00 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
10f10 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
10f20 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
10f30 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
10f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
10f60 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
10f70 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
10f80 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c  sible for a call
10f90 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28   to PcacheFetch(
10fa0 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  ) with createFla
10fb0 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69  g==0 to.  ** fai
10fc0 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65  l, since no atte
10fd0 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
10fe0 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77  dynamic memory w
10ff0 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  ill be made..  *
11000 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  /.  (void)sqlite
11010 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
11020 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
11030 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
11040 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
11050 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
11060 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
11070 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
11080 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
11090 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
110a0 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
110b0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 61  er){.  sqlite3Ba
110c0 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
110d0 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
110e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
110f0 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ar(pPager->pPCac
11100 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  he);.}../*.** Fr
11110 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
11120 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
11130 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
11140 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
11150 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
11160 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
11170 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
11180 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
11190 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
111a0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
111b0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
111c0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
111d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
111e0 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
111f0 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
11200 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
11210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11220 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
11230 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
11240 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
11250 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
11260 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
11270 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
11280 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
11290 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
112a0 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
112b0 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
112c0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
112d0 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
112e0 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
112f0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
11300 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11310 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
11320 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
11330 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
11340 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
11350 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11360 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
11370 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
11380 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
11390 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
113a0 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
113b0 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
113c0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
113d0 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
113e0 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
113f0 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
11400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
11410 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
11420 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
11430 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
11440 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
11450 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
11460 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
11470 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11480 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
11490 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
114a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
114b0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
114c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
114d0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
114e0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
114f0 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
11500 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
11510 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
11520 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
11530 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
11540 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
11550 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
11560 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
11570 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
11580 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
11590 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
115a0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
115b0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
115c0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
115d0 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
115e0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
115f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11610 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
11620 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
11630 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
11640 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a   mode and not.**
11650 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
11660 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
11670 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65 20  it switches the 
11680 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f  pager to PAGER_O
11690 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a  PEN.** state..**
116a0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
116b0 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
116c0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
116d0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
116e0 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65  ile is.** comple
116f0 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49  tely unlocked. I
11700 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
11710 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66  locked and the f
11720 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a  ile-system does.
11730 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74  ** not exhibit t
11740 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  he UNDELETABLE_W
11750 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74  HEN_OPEN propert
11760 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  y, the journal f
11770 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64  ile is.** closed
11780 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29   (if it is open)
11790 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
117a0 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52  ager is in ERROR
117b0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
117c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
117d0 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  led, the .** con
117e0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
117f0 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69 73  er cache are dis
11800 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73 77  carded before sw
11810 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20  itching back to 
11820 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61  .** the OPEN sta
11830 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  te. Regardless o
11840 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70 61  f whether the pa
11850 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11860 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e  ive-mode.** or n
11870 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  ot, any journal 
11880 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65  file left in the
11890 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c   file-system wil
118a0 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20  l be treated.** 
118b0 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
118c0 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
118d0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
118e0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
118f0 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28  n.** is opened (
11900 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e  by this or by an
11910 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  y other connecti
11920 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  on)..*/.static v
11930 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
11940 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11950 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
11960 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
11970 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20 20  R_READER .      
11980 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
11990 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a  te==PAGER_OPEN .
119a0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
119b0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
119c0 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73  ERROR .  );..  s
119d0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
119e0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
119f0 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
11a00 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
11a10 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  0;.  releaseAllS
11a20 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
11a30 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
11a40 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
11a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
11a60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
11a70 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
11a80 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
11a90 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
11aa0 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
11ab0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
11ac0 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OPEN;.  }else if
11ad0 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
11ae0 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
11af0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b10 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   Error code retu
11b20 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c  rned by pagerUnl
11b30 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69  ockDb() */.    i
11b40 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28  nt iDc = isOpen(
11b50 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69  pPager->fd)?sqli
11b60 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
11b70 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
11b80 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f  r->fd):0;..    /
11b90 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
11ba0 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72  ng system suppor
11bb0 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70  t deletion of op
11bc0 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20  en files, then. 
11bd0 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20     ** close the 
11be0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
11bf0 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64  n dropping the d
11c00 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f  atabase lock.  O
11c10 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
11c20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
11c30 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  on with journal_
11c40 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68  mode=delete migh
11c50 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  t delete the fil
11c60 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f  e.    ** out fro
11c70 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20  m under us..    
11c80 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
11c90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11ca0 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21  E_MEMORY   & 5)!
11cb0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11cc0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11cd0 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20  MODE_OFF      & 
11ce0 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
11cf0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11d00 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20  NALMODE_WAL     
11d10 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
11d20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11d30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
11d40 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  E   & 5)!=1 );. 
11d50 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11d60 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
11d70 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29  UNCATE & 5)==1 )
11d80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11d90 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11da0 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d  _PERSIST  & 5)==
11db0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  1 );.    if( 0==
11dc0 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
11dd0 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
11de0 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20  WHEN_OPEN).     
11df0 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a  || 1!=(pPager->j
11e00 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a  ournalMode & 5).
11e10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
11e20 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11e30 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
11e40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
11e50 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 45  ager is in the E
11e60 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
11e70 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63  he call to unloc
11e80 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  k the database. 
11e90 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73     ** file fails
11ea0 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65 6e  , set the curren
11eb0 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57  t lock to UNKNOW
11ec0 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20  N_LOCK. See the 
11ed0 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61  comment.    ** a
11ee0 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
11ef0 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43   for UNKNOWN_LOC
11f00 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
11f10 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73  tion of why this
11f20 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73  .    ** is neces
11f30 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
11f40 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63   rc = pagerUnloc
11f50 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c  kDb(pPager, NO_L
11f60 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
11f70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  !=SQLITE_OK && p
11f80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11f90 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20  AGER_ERROR ){.  
11fa0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
11fb0 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  k = UNKNOWN_LOCK
11fc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11fd0 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  The pager state 
11fe0 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20 66  may be changed f
11ff0 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20  rom PAGER_ERROR 
12000 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65  to PAGER_OPEN he
12010 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75  re.    ** withou
12020 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65  t clearing the e
12030 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20  rror code. This 
12040 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d  is intentional -
12050 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a   the error.    *
12060 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65  * code is cleare
12070 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
12080 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f  reset in the blo
12090 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f  ck below..    */
120a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
120b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
120c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
120d0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
120e0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
120f0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
12100 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12110 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
12120 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61  .  }..  /* If Pa
12130 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
12140 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
12150 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
12160 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
12170 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20  ** trusted. Now 
12180 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
12190 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
121a0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
121b0 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63  pager,.  ** it c
121c0 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62  an safely move b
121d0 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ack to PAGER_OPE
121e0 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68 61  N state. This ha
121f0 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20  ppens in both.  
12200 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78  ** normal and ex
12210 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20  clusive-locking 
12220 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mode..  */.  if(
12230 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12240 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12250 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
12260 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
12270 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
12280 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
12290 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
122a0 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e;.    pPager->e
122b0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
122c0 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  EN;.    pPager->
122d0 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
122e0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  _OK;.  }..  pPag
122f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
12300 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
12310 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
12320 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
12330 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = 0;.}../*.** 
12340 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12350 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
12360 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c   an IOERR or FUL
12370 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71  L error that req
12380 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67  uires.** the pag
12390 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  er to transition
123a0 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
123b0 73 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f  state may ahve o
123c0 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20  ccurred..** The 
123d0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
123e0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
123f0 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
12400 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a  re, the second .
12410 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  ** the error-cod
12420 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
12430 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
12440 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
12450 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65  The .** value re
12460 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
12470 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
12480 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
12490 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
124a0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
124b0 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
124c0 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
124d0 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
124e0 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d  he.** IOERR sub-
124f0 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72  codes, the pager
12500 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f   enters the ERRO
12510 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12520 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
12530 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
12540 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20  .errCode. While 
12550 74 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e  the pager remain
12560 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
12570 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a  tate,.** all maj
12580 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  or API calls on 
12590 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69  the Pager will i
125a0 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
125b0 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
125c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52  .**.** The ERROR
125d0 20 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73   state indicates
125e0 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
125f0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
12600 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
12610 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
12620 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
12630 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
12640 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
12650 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
12660 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
12670 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
12680 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
12690 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
126a0 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
126b0 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
126c0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
126d0 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
126e0 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
126f0 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
12700 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
12710 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
12720 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
12730 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
12740 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12750 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
12760 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
12770 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
12780 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
12790 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
127a0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
127b0 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
127c0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
127d0 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
127e0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
127f0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
12800 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
12810 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
12820 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
12830 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
12840 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
12850 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
12860 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
12870 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
12880 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12890 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20   PAGER_ERROR;.  
128a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
128b0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
128c0 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
128d0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
128e0 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  nPage);../*.** T
128f0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73  his routine ends
12900 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
12910 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  A transaction is
12920 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62   usually ended b
12930 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43  y .** either a C
12940 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42  OMMIT or a ROLLB
12950 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  ACK operation. T
12960 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
12970 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66  be called .** af
12980 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  ter rollback of 
12990 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f  a hot-journal, o
129a0 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
129b0 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69  curs while openi
129c0 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ng.** the journa
129d0 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e  l file or writin
129e0 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  g the very first
129f0 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
12a00 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65  of a.** database
12a10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
12a20 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
12a30 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
12a40 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
12a50 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73   state. If it is
12a60 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41   called.** in PA
12a70 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45  GER_NONE or PAGE
12a80 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61  R_SHARED state a
12a90 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64  nd the lock held
12aa0 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c   is less.** excl
12ab0 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53  usive than a RES
12ac0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69  ERVED lock, it i
12ad0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
12ae0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20   Otherwise, any 
12af0 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
12b00 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a  s are released..
12b10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
12b20 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
12b30 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66  n, then it is "f
12b40 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20  inalized". Once 
12b50 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69  a journal .** fi
12b60 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  le has been fina
12b70 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20  lized it is not 
12b80 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
12b90 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  it to roll back 
12ba0 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  a .** transactio
12bb0 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62  n. Nor will it b
12bc0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
12bd0 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
12be0 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61   by this.** or a
12bf0 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ny other databas
12c00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78  e connection. Ex
12c10 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72  actly how a jour
12c20 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
12c30 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  .** depends on w
12c40 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
12c50 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
12c60 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
12c70 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20  mode and.** the 
12c80 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d  current journal-
12c90 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72  mode (Pager.jour
12ca0 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20  nalMode value), 
12cb0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
12cc0 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12cd0 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a  =MEMORY.**     J
12ce0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
12cf0 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79  riptor is simply
12d00 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65   closed. This de
12d10 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20  stroys an .**   
12d20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72    in-memory jour
12d30 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  nal..**.**   jou
12d40 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41  rnalMode==TRUNCA
12d50 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  TE.**     Journa
12d60 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  l file is trunca
12d70 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ted to zero byte
12d80 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
12d90 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
12da0 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54  PERSIST.**     T
12db0 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65  he first 28 byte
12dc0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
12dd0 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64   file are zeroed
12de0 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74  . This invalidat
12df0 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69  es.**     the fi
12e00 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
12e10 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20  er in the file, 
12e20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e  and hence the en
12e30 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  tire journal.** 
12e40 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76      file. An inv
12e50 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  alid journal fil
12e60 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  e cannot be roll
12e70 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
12e80 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45   journalMode==DE
12e90 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20  LETE.**     The 
12ea0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
12eb0 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
12ec0 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
12ed0 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
12ee0 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67  *     If the pag
12ef0 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
12f00 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
12f10 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20   this method of 
12f20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20  finalizing.**   
12f30 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
12f40 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  le is never used
12f50 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68  . Instead, if th
12f60 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  e journalMode is
12f70 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61  .**     DELETE a
12f80 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
12f90 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12fa0 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65  e, the method de
12fb0 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a  scribed under.**
12fc0 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65       journalMode
12fd0 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65  ==PERSIST is use
12fe0 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
12ff0 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
13000 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c  al is finalized,
13010 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   the pager moves
13020 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
13030 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75   state..** If ru
13040 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63  nning in non-exc
13050 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20  lusive rollback 
13060 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f  mode, the lock o
13070 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a  n the file is .*
13080 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
13090 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  a SHARED_LOCK..*
130a0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
130b0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
130c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49   error occurs. I
130d0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
130e0 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20  s during.** any 
130f0 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74  of the IO operat
13100 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ions to finalize
13110 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13120 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  e or unlock the.
13130 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e  ** database then
13140 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
13150 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
13160 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74  o the user. If t
13170 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  he .** operation
13180 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13190 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
131a0 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ils, then the co
131b0 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65  de still.** trie
131c0 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
131d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
131e0 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
131f0 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a  e mode. If the.*
13200 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  * unlock operati
13210 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c  on fails as well
13220 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
13230 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61   error code rela
13240 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  ted.** to the fi
13250 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  rst error encoun
13260 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e  tered (the journ
13270 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
13280 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72  one) is.** retur
13290 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
132a0 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
132b0 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
132c0 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d  pPager, int hasM
132d0 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d  aster, int bComm
132e0 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  it){.  int rc = 
132f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
13300 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
13310 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
13320 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
13330 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
13340 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13350 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
13360 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
13370 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
13380 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
13390 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  if the pager doe
133a0 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70  s not have an op
133b0 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
133c0 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20  tion.  ** or at 
133d0 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
133e0 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63   lock. This func
133f0 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
13400 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20  ed when there.  
13410 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  ** is no write-t
13420 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
13430 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44  e but a RESERVED
13440 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
13450 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e   is.  ** held un
13460 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74  der two circumst
13470 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ances:.  **.  **
13480 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75     1. After a su
13490 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75  ccessful hot-jou
134a0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
134b0 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  t is called with
134c0 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74  .  **      eStat
134d0 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e  e==PAGER_NONE an
134e0 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
134f0 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20  VE_LOCK..  **.  
13500 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e  **   2. If a con
13510 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63  nection with loc
13520 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
13530 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ive holding an E
13540 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20  XCLUSIVE .  **  
13550 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65      lock switche
13560 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e  s back to lockin
13570 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e  g_mode=normal an
13580 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20  d then executes 
13590 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64  a.  **      read
135a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68  -transaction, th
135b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
135c0 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74  alled with eStat
135d0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
135e0 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65  .  **      and e
135f0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
13600 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65  LOCK when the re
13610 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
13620 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20  s closed..  */. 
13630 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
13640 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
13650 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
13660 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
13670 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
13680 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
13690 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45  tate<PAGER_WRITE
136a0 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67  R_LOCKED && pPag
136b0 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56  er->eLock<RESERV
136c0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
136d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
136e0 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41  .  }..  releaseA
136f0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
13700 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
13710 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
13720 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
13730 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
13740 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
13750 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
13760 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
13770 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
13780 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
13790 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
137a0 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
137b0 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
137c0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  al(pPager->jfd) 
137d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
137e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
137f0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13800 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
13810 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
13820 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
13830 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
13840 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
13850 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13860 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
13870 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
13880 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13890 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
138a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
138b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
138c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
138d0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
138e0 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
138f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
13900 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
13910 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
13920 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13930 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13940 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
13950 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
13960 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
13970 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
13980 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
13990 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
139a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
139b0 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
139c0 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
139d0 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
139e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
139f0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
13a00 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
13a10 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ch may be execut
13a20 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f  ed with Pager.jo
13a30 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
13a40 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20  Y if.      ** a 
13a50 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  hot-journal was 
13a60 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  just rolled back
13a70 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
13a80 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
13a90 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20   ** file should 
13aa0 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  be closed and de
13ab0 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63  leted. If this c
13ac0 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
13ad0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
13ae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
13af0 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73  it will do so us
13b00 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
13b10 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20   journal. .     
13b20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
13b30 65 6c 65 74 65 20 3d 20 28 21 70 50 61 67 65 72  elete = (!pPager
13b40 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 73 71  ->tempFile && sq
13b50 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 45 78 69 73  lite3JournalExis
13b60 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 29  ts(pPager->jfd))
13b70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13b80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13b90 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13ba0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
13bb0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
13bc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13bd0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13be0 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
13bf0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
13c00 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
13c10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13c20 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
13c30 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
13c40 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
13c50 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c  ;.      if( bDel
13c60 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ete ){.        r
13c70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
13c80 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
13c90 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
13ca0 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
13cb0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
13cc0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
13cd0 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
13ce0 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
13cf0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13d00 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
13d10 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
13d20 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
13d30 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
13d40 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
13d50 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
13d60 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 61 67    PgHdr *p = pag
13d70 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
13d80 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 1);.    if( p 
13d90 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65  ){.      p->page
13da0 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hash = 0;.      
13db0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
13dc0 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  f(p);.    }.  }.
13dd0 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
13de0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
13df0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13e00 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
13e10 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
13e20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
13e30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
13e40 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
13e50 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
13e60 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
13e70 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
13e80 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
13e90 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ize);..  if( pag
13ea0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
13eb0 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
13ec0 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
13ed0 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
13ee0 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
13ef0 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
13f00 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
13f10 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
13f20 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
13f30 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
13f40 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
13f50 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
13f60 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
13f70 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
13f80 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
13f90 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
13fa0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
13fb0 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
13fc0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20  E_OK );.  }else 
13fd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13fe0 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20  K && bCommit && 
13ff0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
14000 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze>pPager->dbSiz
14010 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
14020 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
14030 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
14040 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
14050 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  n rollback-journ
14060 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69  al.    ** mode i
14070 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
14080 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c  ile on disk is l
14090 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64  arger than the d
140a0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
140b0 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
140c0 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  int the journal 
140d0 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
140e0 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ed and the trans
140f0 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73  action .    ** s
14100 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d  uccessfully comm
14110 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45  itted, but the E
14120 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
14130 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
14140 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  he.    ** file. 
14150 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  So it is safe to
14160 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   truncate the da
14170 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69  tabase file to i
14180 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  ts minimum.    *
14190 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  * required size.
141a0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
141b0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
141c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
141d0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
141e0 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
141f0 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
14200 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  );.  }..  if( !p
14210 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
14220 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
14230 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
14240 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
14250 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
14260 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
14270 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
14280 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
14290 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
142a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
142b0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
142c0 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
142d0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
142e0 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
142f0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
14300 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
14310 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
14320 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
14330 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
14340 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
14350 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
14360 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
14370 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
14380 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
14390 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
143a0 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
143b0 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
143c0 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
143d0 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
143e0 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
143f0 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
14400 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
14410 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14420 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
14430 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
14440 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
14450 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14460 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
14470 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
14480 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
14490 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
144a0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
144b0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
144c0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
144d0 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
144e0 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
144f0 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
14500 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
14510 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
14520 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
14530 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
14540 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
14550 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
14560 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
14570 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
14580 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
14590 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
145a0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
145b0 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
145c0 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
145d0 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
145e0 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
145f0 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
14600 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
14610 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
14620 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
14630 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
14640 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
14650 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
14660 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
14670 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
14680 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14690 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
146a0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
146b0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
146c0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
146d0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
146e0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
146f0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
14700 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
14710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
14720 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
14730 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14740 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
14750 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
14760 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
14770 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
14780 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14790 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
147a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
147b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
147c0 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
147d0 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
147e0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
147f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
14800 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
14810 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
14820 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
14830 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
14840 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
14850 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
14860 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
14870 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
14880 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
14890 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
148a0 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
148b0 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
148c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
148d0 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
148e0 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
148f0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
14900 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
14910 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
14920 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
14930 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
14940 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
14950 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
14960 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
14970 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
14980 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
14990 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
149a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
149b0 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
149c0 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
149d0 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
149e0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
149f0 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
14a00 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
14a10 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
14a20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
14a30 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
14a40 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
14a50 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
14a60 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
14a70 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
14a80 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
14a90 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
14aa0 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
14ab0 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
14ac0 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
14ad0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
14ae0 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
14af0 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
14b00 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
14b10 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
14b20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
14b30 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
14b40 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
14b50 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
14b60 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
14b70 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
14b80 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
14b90 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
14ba0 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
14bb0 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
14bc0 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
14bd0 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
14be0 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
14bf0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
14c00 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
14c10 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
14c20 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
14c30 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
14c40 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
14c50 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
14c60 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
14c70 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
14c80 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
14c90 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
14ca0 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
14cb0 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
14cc0 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
14cd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
14ce0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
14cf0 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
14d00 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
14d10 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
14d20 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
14d30 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
14d40 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
14d50 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
14d60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14d70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
14d80 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
14d90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
14da0 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
14db0 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
14dc0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
14df0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
14e00 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
14e10 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
14e20 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
14e30 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
14e40 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
14e50 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ec */.#endif../*
14e60 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
14e70 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
14e80 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
14e90 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
14ea0 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
14eb0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
14ec0 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
14ed0 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
14ee0 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
14ef0 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
14f00 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
14f10 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
14f20 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
14f30 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
14f40 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
14f50 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
14f60 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
14f70 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  l..**.** The mai
14f80 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
14f90 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d  al uses checksum
14fa0 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e  s - the statemen
14fb0 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a  t journal does .
14fc0 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ** not..**.** If
14fd0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
14fe0 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
14ff0 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
15000 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15010 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
15020 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
15030 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
15040 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
15050 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
15060 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
15070 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
15080 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
15090 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
150a0 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
150b0 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
150c0 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
150d0 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
150e0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
150f0 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
15100 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
15110 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
15120 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
15130 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
15140 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
15150 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
15160 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
15170 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
15180 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
15190 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
151a0 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
151b0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
151c0 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
151d0 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
151e0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
151f0 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15200 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
15210 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
15220 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
15230 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
15240 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
15250 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
15260 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
15270 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
15280 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
15290 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
152a0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
152b0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
152c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
152d0 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
152e0 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
152f0 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
15300 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
15310 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
15320 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
15330 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
15340 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
15350 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
15360 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
15370 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
15380 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
15390 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
153a0 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
153b0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
153c0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
153d0 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
153e0 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
153f0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
15400 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
15410 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
15420 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
15430 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
15440 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
15450 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
15460 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
15470 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
15480 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15490 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
154a0 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
154b0 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
154c0 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
154d0 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
154e0 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
154f0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
15500 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
15510 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
15520 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
15530 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
15540 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
15550 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
15560 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
15570 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
15580 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
15590 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
155a0 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
155b0 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66  ck */.  i64 *pOf
155c0 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  fset,           
155d0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
155e0 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61  of record to pla
155f0 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  yback */.  Bitve
15600 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20  c *pDone,       
15610 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
15620 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
15630 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
15640 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
15650 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rnl,            
15660 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20     /* 1 -> main 
15670 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75  journal. 0 -> su
15680 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
15690 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20  int isSavepnt   
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
156b0 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65   True for a save
156c0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a  point rollback *
156d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
156e0 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15700 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
15710 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
15720 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
15730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15740 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
15750 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
15760 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
15770 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15790 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
157a0 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
157b0 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  ng */.  char *aD
157c0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
157d0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
157e0 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
157f0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
15800 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
15810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15820 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
15830 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
15840 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
15850 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  isSynced;       
15860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15870 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67  e if journal pag
15880 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a  e is synced */..
15890 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69    assert( (isMai
158a0 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20  nJrnl&~1)==0 ); 
158b0 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72       /* isMainJr
158c0 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nl is 0 or 1 */.
158d0 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76    assert( (isSav
158e0 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20  epnt&~1)==0 );  
158f0 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e       /* isSavepn
15900 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  t is 0 or 1 */. 
15910 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a   assert( isMainJ
15920 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20  rnl || pDone ); 
15930 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77      /* pDone alw
15940 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d  ays used on sub-
15950 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73  journals */.  as
15960 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
15970 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20  || pDone==0 );  
15980 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20   /* pDone never 
15990 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65  used on non-save
159a0 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74  point */..  aDat
159b0 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  a = pPager->pTmp
159c0 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
159d0 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
159e0 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
159f0 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
15a00 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
15a10 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
15a20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
15a30 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61  er)==0 || (!isMa
15a40 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65  inJrnl && isSave
15a50 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69  pnt) );..  /* Ei
15a60 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69  ther the state i
15a70 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
15a80 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
15a90 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74  EMOD (a transact
15aa0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76  ion .  ** or sav
15ab0 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
15ac0 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75  done at the requ
15ad0 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  est of the calle
15ae0 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20  r) or this is.  
15af0 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
15b00 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74   rollback. If it
15b10 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
15b20 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  l rollback, the 
15b30 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e  pager.  ** is in
15b40 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20   state OPEN and 
15b50 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49  holds an EXCLUSI
15b60 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75  VE lock. Hot-jou
15b70 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  rnal rollback.  
15b80 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72  ** only reads fr
15b90 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
15ba0 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62  nal, not the sub
15bb0 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  -journal..  */. 
15bc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15bd0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
15be0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
15bf0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
15c00 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
15c10 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e  OPEN && pPager->
15c20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
15c30 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73  _LOCK).  );.  as
15c40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
15c50 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
15c60 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69  ER_CACHEMOD || i
15c70 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20  sMainJrnl );..  
15c80 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
15c90 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
15ca0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a   data from the j
15cb0 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
15cc0 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e  urnal.  ** file.
15cd0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
15ce0 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
15cf0 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ler if an IO err
15d00 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a  or occurs..  */.
15d10 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72    jfd = isMainJr
15d20 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  nl ? pPager->jfd
15d30 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b   : pPager->sjfd;
15d40 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
15d50 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74  ts(jfd, *pOffset
15d60 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
15d70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
15d80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
15d90 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
15da0 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  jfd, (u8*)aData,
15db0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15dc0 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29  e, (*pOffset)+4)
15dd0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
15de0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
15df0 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d  c;.  *pOffset +=
15e00 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15e10 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72  e + 4 + isMainJr
15e20 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nl*4;..  /* Sani
15e30 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
15e40 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
15e50 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
15e60 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
15e70 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
15e80 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
15e90 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
15ea0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
15eb0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
15ec0 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
15ed0 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
15ee0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
15ef0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
15f00 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
15f10 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
15f20 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
15f30 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
15f40 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
15f50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
15f60 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
15f70 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
15f80 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
15f90 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b  t( !isSavepnt );
15fa0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15fb0 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
15fc0 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50  f( pgno>(Pgno)pP
15fd0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20  ager->dbSize || 
15fe0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
15ff0 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29  t(pDone, pgno) )
16000 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16010 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
16020 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
16030 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
16040 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73  its(jfd, (*pOffs
16050 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a  et)-4, &cksum);.
16060 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
16070 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
16080 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61  !isSavepnt && pa
16090 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
160a0 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63  , (u8*)aData)!=c
160b0 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
160c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
160d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
160e0 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68  * If this page h
160f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
16100 70 6c 61 79 65 64 20 62 79 20 62 65 66 6f 72 65  played by before
16110 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
16120 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  ent.  ** rollbac
16130 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f  k, then don't bo
16140 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20  ther to play it 
16150 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f  back again..  */
16160 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
16170 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
16180 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
16190 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
161a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
161b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
161c0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
161d0 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
161e0 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
161f0 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
16200 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
16210 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
16220 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
16230 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
16240 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
16250 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
16260 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
16270 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
16280 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16290 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65  n CACHEMOD state
162a0 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
162b0 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
162c0 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
162d0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
162e0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
162f0 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
16300 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
16310 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
16320 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
16330 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
16340 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
16350 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
16360 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
16370 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
16380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16390 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
163a0 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
163b0 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
163c0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
163d0 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
163e0 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
163f0 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
16400 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
16410 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
16420 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
16430 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
16440 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
16450 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
16460 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
16470 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
16480 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
16490 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
164a0 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
164b0 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
164c0 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
164d0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57   **.  ** If in W
164e0 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49  RITER_DBMOD, WRI
164f0 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20  TER_FINISHED or 
16500 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e  OPEN state, then
16510 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a 20   we update the. 
16520 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65 20   ** pager cache 
16530 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e 64  if it exists and
16540 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
16550 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
16560 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f   marked .  ** no
16570 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74  t dirty. Since t
16580 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79  his code is only
16590 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41 47   executed in PAG
165a0 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f  ER_OPEN state fo
165b0 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  r.  ** a hot-jou
165c0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
165d0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
165e0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63 61  that the page-ca
165f0 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a  che is empty.  *
16600 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
16610 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e  s in OPEN state.
16620 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
16630 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
16640 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
16650 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
16660 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
16670 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
16680 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
16690 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
166a0 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
166b0 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
166c0 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
166d0 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
166e0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
166f0 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
16700 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
16710 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
16720 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
16730 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
16740 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
16750 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
16760 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
16770 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
16780 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
16790 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
167a0 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
167b0 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
167c0 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
167d0 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
167e0 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
167f0 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
16800 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
16810 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
16820 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
16830 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
16840 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
16850 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
16860 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
16870 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
16880 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
16890 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
168a0 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
168b0 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
168c0 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
168d0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
168e0 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
168f0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
16900 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
16910 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
16920 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
16930 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
16940 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
16950 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16960 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
16970 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
16980 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
16990 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
169a0 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
169b0 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
169c0 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
169d0 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
169e0 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
169f0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
16a00 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
16a10 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
16a20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
16a30 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
16a40 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
16a50 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
16a60 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
16a70 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
16a80 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
16a90 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  opened..  */.  i
16aa0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
16ab0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50  Pager) ){.    pP
16ac0 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
16ad0 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
16ae0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
16af0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  gno);.  }.  asse
16b00 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44  rt( pPg || !MEMD
16b10 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
16b20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
16b30 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67  AGER_OPEN || pPg
16b40 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  ==0 );.  PAGERTR
16b50 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE(("PLAYBACK %
16b60 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
16b70 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20  08x) %s\n",.    
16b80 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
16b90 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
16ba0 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
16bb0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
16bc0 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20  u8*)aData),.    
16bd0 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72         (isMainJr
16be0 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c  nl?"main-journal
16bf0 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29  ":"sub-journal")
16c00 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d  .  ));.  if( isM
16c10 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69  ainJrnl ){.    i
16c20 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  sSynced = pPager
16c30 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f  ->noSync || (*pO
16c40 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d  ffset <= pPager-
16c50 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
16c60 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e  }else{.    isSyn
16c70 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c  ced = (pPg==0 ||
16c80 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20   0==(pPg->flags 
16c90 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
16ca0 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  C));.  }.  if( i
16cb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
16cc0 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
16cd0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
16ce0 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
16cf0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
16d00 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26  AGER_OPEN).   &&
16d10 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20   isSynced.  ){. 
16d20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70     i64 ofst = (p
16d30 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
16d40 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
16d50 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53    testcase( !isS
16d60 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30  avepnt && pPg!=0
16d70 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
16d80 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
16d90 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
16da0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
16db0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
16dc0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
16dd0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
16de0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
16df0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
16e00 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  t);.    if( pgno
16e10 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
16e20 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
16e30 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
16e40 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
16e50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
16e60 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43  ackup ){.      C
16e70 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
16e80 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
16e90 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
16ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
16eb0 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
16ec0 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
16ed0 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
16ee0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
16ef0 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
16f00 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
16f10 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  EM, aData);.    
16f20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
16f30 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
16f40 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
16f50 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
16f60 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
16f70 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
16f80 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
16f90 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
16fa0 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
16fb0 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
16fc0 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
16fd0 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
16fe0 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
16ff0 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
17000 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
17010 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
17020 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
17030 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
17040 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
17050 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
17060 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
17070 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
17080 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
17090 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
170a0 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
170b0 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
170c0 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
170d0 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
170e0 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
170f0 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
17100 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
17110 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
17120 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
17130 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
17140 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
17150 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
17160 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
17170 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
17180 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
17190 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
171a0 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
171b0 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
171c0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
171d0 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
171e0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
171f0 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
17200 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
17210 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
17220 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
17230 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
17240 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
17250 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
17260 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
17270 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
17280 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
17290 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
172a0 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
172b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
172c0 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61  Savepnt );.    a
172d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
172e0 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a  oNotSpill==0 );.
172f0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
17300 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63  tSpill++;.    rc
17310 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
17320 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
17330 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20  gno, &pPg, 1);. 
17340 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
17350 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31  r->doNotSpill==1
17360 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
17370 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20  doNotSpill--;.  
17380 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17390 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
173a0 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
173b0 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
173c0 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
173d0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
173e0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
173f0 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
17400 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
17410 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
17420 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
17430 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
17440 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
17450 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
17460 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
17470 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
17480 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
17490 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
174a0 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
174b0 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
174c0 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
174d0 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
174e0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
174f0 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
17500 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
17510 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
17520 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
17530 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
17540 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
17550 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
17560 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
17570 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
17580 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17590 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
175a0 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
175b0 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
175c0 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
175d0 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
175e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
175f0 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
17600 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
17610 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
17620 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
17630 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
17640 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
17650 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
17660 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
17670 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
17680 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
17690 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
176a0 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
176b0 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
176c0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
176d0 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
176e0 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
176f0 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
17700 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
17710 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
17720 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  abase..      **.
17730 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
17740 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20  s one exception 
17750 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66  to this rule. If
17760 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
17770 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20  ng rolled.      
17780 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20  ** back as part 
17790 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28  of a savepoint (
177a0 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f  or statement) ro
177b0 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a  llback from an .
177c0 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65        ** unsynce
177d0 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
177e0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
177f0 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e  le, then it is n
17800 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a  ot safe.      **
17810 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
17820 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73  e as clean. This
17830 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b   is because mark
17840 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a  ing the page as.
17850 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77        ** clean w
17860 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ill clear the PG
17870 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
17880 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  ag. Since the pa
17890 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ge is.      ** a
178a0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
178b0 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f  urnal file (reco
178c0 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49  rded in Pager.pI
178d0 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20  nJournal) and.  
178e0 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
178f0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
17900 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74  is cleared, if t
17910 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
17920 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61  en to.      ** a
17930 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
17940 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
17950 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20   will be marked 
17960 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20  as dirty but.   
17970 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
17980 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77  NEED_SYNC flag w
17990 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20  ill not be set. 
179a0 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f  It could then po
179b0 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20  tentially.      
179c0 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  ** be written ou
179d0 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
179e0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
179f0 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
17a00 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
17a10 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20  t is synced. If 
17a20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64  a crash occurs d
17a30 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69  uring or followi
17a40 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a  ng this,.      *
17a50 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  * database corru
17a60 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e  ption may ensue.
17a70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17a80 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
17a90 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
17aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
17ab0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
17ac0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
17ad0 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
17ae0 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pPg);..    /* If
17af0 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
17b00 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
17b10 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
17b20 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20  r.dbFileVers..  
17b30 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66    ** Do this bef
17b40 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67  ore any decoding
17b50 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
17b60 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  o==1 ){.      me
17b70 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
17b80 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a  FileVers, &((u8*
17b90 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65  )pData)[24],size
17ba0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
17bb0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a  eVers));.    }..
17bc0 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
17bd0 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64  e page just read
17be0 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20   from disk */.  
17bf0 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
17c00 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
17c10 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 3, rc=SQLITE_
17c20 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69  NOMEM);.    sqli
17c30 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
17c40 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
17c50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17c60 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
17c70 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
17c80 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
17c90 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
17ca0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
17cb0 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
17cc0 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
17cd0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
17ce0 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
17cf0 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
17d00 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
17d10 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
17d20 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
17d30 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
17d40 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
17d50 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
17d60 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65   Argument zMaste
17d70 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50  r may point to P
17d80 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20  ager.pTmpSpace. 
17d90 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69  So that buffer i
17da0 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61  s not .** availa
17db0 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ble for use with
17dc0 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
17dd0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d  ..**.** When a m
17de0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17df0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69  le is created, i
17e00 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  t is populated w
17e10 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a  ith the names .*
17e20 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20  * of all of its 
17e30 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20  child journals, 
17e40 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65  one after anothe
17e50 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20  r, formatted as 
17e60 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65  utf-8 .** encode
17e70 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20  d text. The end 
17e80 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  of each child jo
17e90 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61  urnal file is ma
17ea0 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20  rked with a .** 
17eb0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
17ec0 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e  yte (0x00). i.e.
17ed0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
17ee0 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72  ents of a master
17ef0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
17f00 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
17f10 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f  on involving two
17f20 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74   databases might
17f30 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68   be:.**.**   "/h
17f40 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f  ome/bill/a.db-jo
17f50 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62  urnal\x00/home/b
17f60 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/b.db-journal
17f70 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61  \x00".**.** A ma
17f80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
17f90 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65  e may only be de
17fa0 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f  leted once all o
17fb0 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20  f its child .** 
17fc0 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65  journals have be
17fd0 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
17fe0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
17ff0 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f  ion reads the co
18000 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
18010 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
18020 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72  e into .** memor
18030 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f  y and loops thro
18040 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20  ugh each of the 
18050 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61  child journal na
18060 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68  mes. For.** each
18070 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20   child journal, 
18080 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a  it checks if:.**
18090 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
180a0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69  hild journal exi
180b0 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a  sts, and if so.*
180c0 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
180d0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  ld journal conta
180e0 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  ins a reference 
180f0 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  to master journa
18100 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a  l .**     file z
18110 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  Master.**.** If 
18120 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  a child journal 
18130 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61  can be found tha
18140 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f  t matches both o
18150 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  f the criteria.*
18160 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75  * above, this fu
18170 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
18180 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
18190 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  thing. Otherwise
181a0 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  , if.** no such 
181b0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
181c0 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65  n be found, file
181d0 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65   zMaster is dele
181e0 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
181f0 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e  file-system usin
18200 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
18210 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
18220 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e   IO error within
18230 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
18240 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
18250 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
18260 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  ** function allo
18270 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20  cates memory by 
18280 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d  calling sqlite3M
18290 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61  alloc(). If an a
182a0 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69  llocation.** fai
182b0 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
182c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
182d0 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49  herwise, if no I
182e0 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  O or malloc erro
182f0 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51  rs .** occur, SQ
18300 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18310 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ned..**.** TODO:
18320 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
18330 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c  llocates a singl
18340 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
18350 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65  y to load.** the
18360 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
18370 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
18380 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
18390 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20  s could be.** a 
183a0 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79  couple of kiloby
183b0 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65  tes or so - pote
183c0 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74  ntially larger t
183d0 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a  han the page .**
183e0 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
183f0 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
18400 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
18410 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
18420 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
18430 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
18440 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
18450 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
18460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
18470 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
18480 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
18490 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f  ter;    /* Mallo
184a0 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  c'd master-journ
184b0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
184c0 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
184d0 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20  file *pJournal; 
184e0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68    /* Malloc'd ch
184f0 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild-journal file
18500 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
18510 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
18520 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
18530 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
18540 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
18550 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f  .  i64 nMasterJo
18560 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  urnal;       /* 
18570 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
18580 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
18590 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
185a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
185b0 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75  inter to one jou
185c0 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66  rnal within MJ f
185d0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
185e0 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
185f0 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
18600 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20  old MJ filename 
18610 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66  from a journal f
18620 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ile */.  int nMa
18630 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
18640 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
18650 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
18660 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20  to zMasterPtr[] 
18670 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
18680 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
18690 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
186a0 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
186b0 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
186c0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
186d0 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
186e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
186f0 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
18700 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
18710 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
18720 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
18730 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
18740 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
18750 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
18760 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
18770 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
18780 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
18790 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
187a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
187b0 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  lse{.    const i
187c0 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
187d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
187e0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
187f0 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  TER_JOURNAL);.  
18800 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18810 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74  Open(pVfs, zMast
18820 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61  er, pMaster, fla
18830 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  gs, 0);.  }.  if
18840 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18850 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
18860 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64  _out;..  /* Load
18870 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
18880 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18890 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
188a0 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71  ned from.  ** sq
188b0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
188c0 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
188d0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
188e0 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20     Also obtain. 
188f0 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73   ** sufficient s
18900 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72  pace (in zMaster
18910 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65  Ptr) to hold the
18920 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72   names of master
18930 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
18940 6c 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72  les extracted fr
18950 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62  om regular rollb
18960 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20  ack-journals..  
18970 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
18980 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73  3OsFileSize(pMas
18990 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
189a0 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
189b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
189c0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
189d0 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20  .  nMasterPtr = 
189e0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
189f0 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  +1;.  zMasterJou
18a00 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61  rnal = sqlite3Ma
18a10 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65  lloc((int)nMaste
18a20 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
18a30 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66  erPtr + 1);.  if
18a40 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
18a50 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
18a60 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
18a70 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18a80 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  ut;.  }.  zMaste
18a90 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
18aa0 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
18ab0 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d  urnal+1];.  rc =
18ac0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
18ad0 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
18ae0 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61  ournal, (int)nMa
18af0 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
18b00 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18b10 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
18b20 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61  aster_out;.  zMa
18b30 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
18b40 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b  terJournal] = 0;
18b50 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a  ..  zJournal = z
18b60 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
18b70 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
18b80 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
18b90 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
18ba0 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73   ){.    int exis
18bb0 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ts;.    rc = sql
18bc0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
18bd0 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  s, zJournal, SQL
18be0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
18bf0 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20  S, &exists);.   
18c00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18c10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
18c20 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18c30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78      }.    if( ex
18c40 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ists ){.      /*
18c50 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
18c60 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
18c70 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
18c80 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
18c90 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
18ca0 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
18cb0 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
18cc0 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
18cd0 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
18ce0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
18cf0 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
18d00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
18d10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
18d20 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c   c;.      int fl
18d30 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
18d40 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
18d50 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
18d60 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20  RNAL);.      rc 
18d70 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
18d80 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
18d90 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c  pJournal, flags,
18da0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
18db0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18dc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
18dd0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
18de0 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20    }..      rc = 
18df0 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
18e00 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  l(pJournal, zMas
18e10 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50  terPtr, nMasterP
18e20 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tr);.      sqlit
18e30 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e  e3OsClose(pJourn
18e40 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
18e50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18e60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
18e70 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
18e80 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a    }..      c = z
18e90 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20  MasterPtr[0]!=0 
18ea0 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
18eb0 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
18ec0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29  0;.      if( c )
18ed0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
18ee0 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
18ef0 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
18f00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18f10 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
18f20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18f30 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
18f40 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b  }.    zJournal +
18f50 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  = (sqlite3Strlen
18f60 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  30(zJournal)+1);
18f70 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33  .  }. .  sqlite3
18f80 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
18f90 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18fa0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
18fb0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c  Master, 0);..del
18fc0 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71  master_out:.  sq
18fd0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
18fe0 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
18ff0 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( pMaster ){.   
19000 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19010 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
19020 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a  sert( !isOpen(pJ
19030 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73  ournal) );.    s
19040 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
19050 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ter);.  }.  retu
19060 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
19070 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
19080 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65  s used to change
19090 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   the actual size
190a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
190b0 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65   .** file in the
190c0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68   file-system. Th
190d0 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
190e0 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20  when committing 
190f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  a transaction,.*
19100 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  * or rolling bac
19110 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
19120 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69  (including rolli
19130 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ng back a hot-jo
19140 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  urnal)..**.** If
19150 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
19160 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f  se file is not o
19170 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65  pen, or the page
19180 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68  r is not in eith
19190 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f  er.** DBMOD or O
191a0 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20  PEN state, this 
191b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
191c0 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
191d0 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20  the size .** of 
191e0 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e  the file is chan
191f0 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
19200 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
19210 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
19220 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  ). .** If the fi
19230 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75  le on disk is cu
19240 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74  rrently larger t
19250 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c  han nPage pages,
19260 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46   then use the VF
19270 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29  S.** xTruncate()
19280 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63   method to trunc
19290 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  ate it..**.** Or
192a0 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74  , it might might
192b0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
192c0 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
192d0 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
192e0 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
192f0 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
19300 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
19310 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
19320 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
19330 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
19340 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
19350 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
19360 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
19370 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
19380 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
19390 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
193a0 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
193b0 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
193c0 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
193d0 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
193e0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
193f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19400 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
19410 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
19420 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
19430 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
19440 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
19450 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
19460 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
19470 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
19480 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
19490 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
194a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
194b0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
194c0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
194d0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
194e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
194f0 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44  tate!=PAGER_READ
19500 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69  ER );.  .  if( i
19510 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
19520 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  ) .   && (pPager
19530 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
19540 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
19550 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
19560 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29  PAGER_OPEN) .  )
19570 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e  {.    i64 curren
19580 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a  tSize, newSize;.
19590 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d      int szPage =
195a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
195b0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
195c0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
195d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
195e0 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20      /* TODO: Is 
195f0 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50  it safe to use P
19600 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20  ager.dbFileSize 
19610 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20  here? */.    rc 
19620 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
19630 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
19640 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
19650 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50     newSize = szP
19660 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  age*(i64)nPage;.
19670 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19680 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
19690 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
196a0 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
196b0 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
196c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
196d0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
196e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
196f0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
19700 73 65 20 69 66 28 20 28 63 75 72 72 65 6e 74 53  se if( (currentS
19710 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77  ize+szPage)<=new
19720 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
19730 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61  char *pTmp = pPa
19740 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
19750 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
19760 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b  Tmp, 0, szPage);
19770 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
19780 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
19790 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69  ge) == currentSi
197a0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ze );.        te
197b0 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
197c0 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72  -szPage) >  curr
197d0 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
197e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
197f0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
19800 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c  d, pTmp, szPage,
19810 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29   newSize-szPage)
19820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19830 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19840 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
19850 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
19860 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
19870 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19880 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19890 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69   Return a saniti
198a0 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  zed version of t
198b0 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f  he sector-size o
198c0 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e  f OS file pFile.
198d0 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
198e0 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74 65  alue is guarante
198f0 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65  ed to lie betwee
19900 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43  n 32 and MAX_SEC
19910 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74  TOR_SIZE..*/.int
19920 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69   sqlite3SectorSi
19930 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
19940 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69  *pFile){.  int i
19950 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  Ret = sqlite3OsS
19960 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29  ectorSize(pFile)
19970 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32 20  ;.  if( iRet<32 
19980 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31  ){.    iRet = 51
19990 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  2;.  }else if( i
199a0 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  Ret>MAX_SECTOR_S
199b0 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  IZE ){.    asser
199c0 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  t( MAX_SECTOR_SI
199d0 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69  ZE>=512 );.    i
199e0 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52  Ret = MAX_SECTOR
199f0 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _SIZE;.  }.  ret
19a00 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn iRet;.}../*.
19a10 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
19a20 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
19a30 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
19a40 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
19a50 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
19a60 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
19a70 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
19a80 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
19a90 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
19aa0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
19ab0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
19ac0 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a  l be used used .
19ad0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
19ae0 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
19af0 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
19b00 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
19b10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19b20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
19b30 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
19b40 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
19b50 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
19b60 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
19b70 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
19b80 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
19b90 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
19ba0 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
19bb0 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
19bc0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
19bd0 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
19be0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
19bf0 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
19c00 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
19c10 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20   up to 32 if.** 
19c20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
19c30 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  32, or rounded d
19c40 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
19c50 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
19c60 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
19c70 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
19c80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
19c90 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54  le has the SQLIT
19ca0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
19cb0 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70  E_OVERWRITE prop
19cc0 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a  erty, then set.*
19cd0 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  * the effective 
19ce0 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69  sector size to i
19cf0 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  ts minimum value
19d00 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72   (512).  The pur
19d10 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65  pose of.** pPage
19d20 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  r->sectorSize is
19d30 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22   to define the "
19d40 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66  blast radius" of
19d50 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d   bytes that.** m
19d60 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61  ight change if a
19d70 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68   crash occurs wh
19d80 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ile writing to a
19d90 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a   single byte in.
19da0 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20  ** that range.  
19db0 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41  But with POWERSA
19dc0 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68  FE_OVERWRITE, th
19dd0 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69  e blast radius i
19de0 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20  s zero.** (that 
19df0 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46  is what POWERSAF
19e00 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e  E_OVERWRITE mean
19e10 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69  s), so we minimi
19e20 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a  ze the sector.**
19e30 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b   size.  For back
19e40 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
19e50 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ity of the rollb
19e60 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
19e70 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63   format,.** we c
19e80 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65  annot reduce the
19e90 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
19ea0 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32  r size below 512
19eb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19ec0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
19ed0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19ee0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
19ef0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
19f00 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
19f10 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
19f20 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c  ->tempFile.   ||
19f30 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
19f40 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
19f50 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a  (pPager->fd) & .
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19f70 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
19f80 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21  SAFE_OVERWRITE)!
19f90 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =0.  ){.    /* S
19fa0 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
19fb0 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
19fc0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
19fd0 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
19fe0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
19ff0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
1a000 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
1a010 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
1a020 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
1a030 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a  will segfault. *
1a040 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
1a050 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
1a060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
1a070 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1a080 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53  = sqlite3SectorS
1a090 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
1a0a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
1a0b0 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
1a0c0 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
1a0d0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
1a0e0 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
1a0f0 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
1a100 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
1a110 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
1a120 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
1a130 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1a140 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
1a150 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
1a160 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
1a170 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
1a180 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
1a190 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1a1a0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1a1b0 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
1a1c0 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
1a1d0 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
1a1e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1a1f0 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
1a200 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1a210 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
1a220 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
1a230 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
1a240 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
1a250 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
1a260 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1a270 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1a280 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
1a290 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
1a2a0 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
1a2b0 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
1a2c0 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
1a2d0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1a2e0 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
1a2f0 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
1a300 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
1a310 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
1a320 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
1a330 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1a340 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1a350 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
1a360 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
1a370 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
1a380 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
1a390 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
1a3a0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1a3b0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1a3c0 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20   page size..**  
1a3d0 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e  (7)  zero paddin
1a3e0 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78  g out to the nex
1a3f0 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  t sector size..*
1a400 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20  *  (8)  Zero or 
1a410 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
1a420 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
1a430 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
1a440 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
1a450 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
1a460 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
1a470 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
1a480 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
1a490 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
1a4a0 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
1a4b0 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
1a4c0 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
1a4d0 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37  mean the first 7
1a4e0 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
1a4f0 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
1a500 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
1a510 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1a520 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   8th item..**.**
1a530 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
1a540 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
1a550 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
1a560 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
1a570 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
1a580 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
1a590 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
1a5a0 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
1a5b0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
1a5c0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
1a5d0 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
1a5e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1a5f0 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
1a600 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
1a610 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
1a620 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1a630 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
1a640 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
1a650 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
1a660 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1a670 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
1a680 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
1a690 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
1a6a0 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
1a6b0 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
1a6c0 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
1a6d0 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
1a6e0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1a6f0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
1a700 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1a710 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
1a720 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
1a730 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
1a740 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
1a750 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
1a760 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
1a770 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
1a780 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
1a790 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
1a7a0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1a7b0 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1a7c0 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
1a7d0 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
1a7e0 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
1a7f0 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
1a800 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
1a810 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
1a820 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
1a830 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
1a840 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
1a850 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
1a860 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
1a870 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
1a880 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
1a890 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
1a8a0 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
1a8b0 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
1a8c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1a8d0 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
1a8e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1a8f0 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
1a900 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
1a910 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
1a920 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
1a930 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
1a940 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
1a950 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
1a960 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1a970 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
1a980 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
1a990 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
1a9a0 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
1a9b0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1a9c0 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
1a9d0 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
1a9e0 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
1a9f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1aa00 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
1aa10 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1aa20 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
1aa30 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
1aa40 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1aa50 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
1aa60 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20  **.** The isHot 
1aa70 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1aa80 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20  tes that we are 
1aa90 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  trying to rollba
1aaa0 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ck a journal.** 
1aab0 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20  that might be a 
1aac0 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72  hot journal.  Or
1aad0 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1aae0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1aaf0 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20  s .** preserved 
1ab00 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e  because of JOURN
1ab10 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f  ALMODE_PERSIST o
1ab20 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  r JOURNALMODE_TR
1ab30 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68  UNCATE..** If th
1ab40 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79  e journal really
1ab50 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74   is hot, reset t
1ab60 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70  he pager cache p
1ab70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20  rior rolling.** 
1ab80 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74  back any content
1ab90 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  .  If the journa
1aba0 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73  l is merely pers
1abb0 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74  istent, no reset
1abc0 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a   is.** needed..*
1abd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1abe0 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
1abf0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
1ac00 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  sHot){.  sqlite3
1ac10 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1ac20 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34  ger->pVfs;.  i64
1ac30 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
1ac40 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1ac50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ac60 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1ac70 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
1ac80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ac90 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
1aca0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
1acb0 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
1acc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1acd0 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1ace0 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
1acf0 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
1ad00 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1ad10 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
1ad20 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
1ad30 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1ad40 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1ad50 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
1ad60 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1ad70 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
1ad80 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
1ad90 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
1ada0 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63  sAccess() */.  c
1adb0 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
1adc0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
1add0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
1ade0 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
1adf0 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72  .  int needPager
1ae00 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54  Reset;      /* T
1ae10 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67  rue to reset pag
1ae20 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74  e prior to first
1ae30 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a   page rollback *
1ae40 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
1ae50 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
1ae60 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a  rds are in the j
1ae70 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65  ournal.  Abort e
1ae80 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65  arly if.  ** the
1ae90 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74   journal is empt
1aea0 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
1aeb0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1aec0 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20  >jfd) );.  rc = 
1aed0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1aee0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
1aef0 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
1af00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1af10 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1af20 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
1af30 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
1af40 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
1af50 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
1af60 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
1af70 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
1af80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
1af90 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
1afa0 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
1afb0 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
1afc0 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
1afd0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
1afe0 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
1aff0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
1b000 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
1b010 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
1b020 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20  Technically the 
1b030 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20  following is an 
1b040 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74  error because it
1b050 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20   assumes that.  
1b060 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e  ** buffer Pager.
1b070 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78  pTmpSpace is (mx
1b080 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65  Pathname+1) byte
1b090 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65  s or larger. i.e
1b0a0 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61  . that.  ** (pPa
1b0b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d  ger->pageSize >=
1b0c0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1b0d0 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73  xPathname+1). Us
1b0e0 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20  ing os_unix.c,. 
1b0f0 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20   **  mxPathname 
1b100 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73  is 512, which is
1b110 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1b120 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62   minimum allowab
1b130 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f  le value.  ** fo
1b140 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f  r pageSize..  */
1b150 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61  .  zMaster = pPa
1b160 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1b170 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1b180 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1b190 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1b1a0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1b1b0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66  athname+1);.  if
1b1c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b1d0 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b  && zMaster[0] ){
1b1e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b1f0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
1b200 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
1b210 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1b220 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  res);.  }.  zMas
1b230 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  ter = 0;.  if( r
1b240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1b250 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !res ){.    goto
1b260 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1b270 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
1b280 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e  rnalOff = 0;.  n
1b290 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
1b2a0 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69  isHot;..  /* Thi
1b2b0 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
1b2c0 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20  s either when a 
1b2d0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
1b2e0 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f   or .  ** pager_
1b2f0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1b300 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  e() call returns
1b310 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
1b320 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a  an IO error .  *
1b330 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a  * occurs. .  */.
1b340 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1b350 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
1b360 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
1b370 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
1b380 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
1b390 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
1b3a0 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
1b3b0 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
1b3c0 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
1b3d0 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
1b3e0 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
1b3f0 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
1b400 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61   process must ha
1b410 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  ve failed while 
1b420 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
1b430 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
1b440 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
1b450 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
1b460 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
1b470 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
1b480 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69  nalHdr(pPager, i
1b490 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  sHot, szJ, &nRec
1b4a0 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
1b4b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b4c0 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
1b4d0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1b4e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1b4f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1b500 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
1b510 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
1b520 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1b530 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
1b540 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
1b550 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1b560 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
1b570 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
1b580 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
1b590 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
1b5a0 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
1b5b0 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
1b5c0 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
1b5d0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
1b5e0 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
1b5f0 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
1b600 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1b610 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
1b620 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
1b630 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1b640 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
1b650 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b660 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b670 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
1b680 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
1b690 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
1b6a0 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f  ((szJ - JOURNAL_
1b6b0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
1b6c0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1b6d0 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1b6e0 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
1b6f0 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
1b700 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
1b710 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
1b720 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
1b730 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74  process and if t
1b740 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c  his is the final
1b750 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a   header in the j
1b760 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20  ournal, then it 
1b770 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61  means.    ** tha
1b780 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  t this part of t
1b790 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1b7a0 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20  eing filled but 
1b7b0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1b7c0 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74  .    ** synced t
1b7d0 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65  o disk.  Compute
1b7e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1b7f0 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ages based on th
1b800 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20  e remaining.    
1b810 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ** size of the f
1b820 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
1b830 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72  ** The third ter
1b840 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61  m of the test wa
1b850 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74  s added to fix t
1b860 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20  icket #2565..   
1b870 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67   ** When rolling
1b880 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72   back a hot jour
1b890 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77  nal, nRec==0 alw
1b8a0 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ays means that t
1b8b0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63  he next.    ** c
1b8c0 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  hunk of the jour
1b8d0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72  nal contains zer
1b8e0 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f  o pages to be ro
1b8f0 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a  lled back.  But.
1b900 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e      ** when doin
1b910 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64  g a ROLLBACK and
1b920 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75   the nRec==0 chu
1b930 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63  nk is the last c
1b940 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74  hunk in.    ** t
1b950 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d  he journal, it m
1b960 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f  eans that the jo
1b970 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
1b980 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20  ain additional. 
1b990 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74     ** pages that
1b9a0 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c   need to be roll
1b9b0 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ed back and that
1b9c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1b9d0 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f  ages .    ** sho
1b9e0 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
1b9f0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  based on the jou
1ba00 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a  rnal file size..
1ba10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1ba20 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
1ba30 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
1ba40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
1ba50 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1ba60 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
1ba70 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
1ba80 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1ba90 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
1baa0 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
1bab0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1bac0 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1bad0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1bae0 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
1baf0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
1bb00 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
1bb10 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
1bb20 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
1bb30 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
1bb40 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1bb50 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1bb60 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1bb70 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
1bb80 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1bb90 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
1bba0 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
1bbb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bbc0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1bbd0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1bbe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1bbf0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78  ger->dbSize = mx
1bc00 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  Pg;.    }..    /
1bc10 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
1bc20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
1bc30 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
1bc40 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  k into the .    
1bc50 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1bc60 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63   and/or page cac
1bc70 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  he..    */.    f
1bc80 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20  or(u=0; u<nRec; 
1bc90 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  u++){.      if( 
1bca0 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29  needPagerReset )
1bcb0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
1bcc0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1bcd0 20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72         needPager
1bce0 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  Reset = 0;.     
1bcf0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61   }.      rc = pa
1bd00 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1bd10 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50  _page(pPager,&pP
1bd20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1bd30 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69  ,0,1,0);.      i
1bd40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bd50 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1bd60 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1bd70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
1bd80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1bd90 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
1bda0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1bdb0 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
1bdc0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1bdd0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
1bde0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
1bdf0 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72  rnal has been tr
1be00 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20  uncated, simply 
1be10 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64  stop reading and
1be20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1be30 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75  ocessing the jou
1be40 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74  rnal. This might
1be50 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a   happen if the j
1be60 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20  ournal was.     
1be70 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70       ** not comp
1be80 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61  letely written a
1be90 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20  nd synced prior 
1bea0 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20  to a crash.  In 
1beb0 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
1bec0 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61  * case, the data
1bed0 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65  base should have
1bee0 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74   never been writ
1bef0 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ten in the.     
1bf00 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c       ** first pl
1bf10 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20  ace so it is OK 
1bf20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f  to simply abando
1bf30 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  n the rollback. 
1bf40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
1bf50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1bf60 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1bf70 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1bf80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bf90 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1bfa0 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  unable to rollba
1bfb0 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74  ck, quit and ret
1bfc0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20  urn the error.  
1bfd0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e          ** code.
1bfe0 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
1bff0 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65  e the pager to e
1c000 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
1c010 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a  tate.          *
1c020 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72  * so that no fur
1c030 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62  ther harm will b
1c040 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73  e done.  Perhaps
1c050 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20   the next.      
1c060 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74      ** process t
1c070 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c  o come along wil
1c080 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c  l be able to rol
1c090 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61  lback the databa
1c0a0 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
1c0b0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1c0c0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c0d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c0e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
1c0f0 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
1c100 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
1c110 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f  layback:.  /* Fo
1c120 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61  llowing a rollba
1c130 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
1c140 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
1c150 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67  back in its orig
1c160 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20  inal.  ** state 
1c170 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
1c180 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
1c190 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65  ction, so invoke
1c1a0 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
1c1b0 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1c1c0 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GED file-control
1c1d0 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62   method to disab
1c1e0 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65  le the.  ** asse
1c1f0 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74  rtion that the t
1c200 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1c210 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e  er was modified.
1c220 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1c230 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1c240 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1c250 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  hods ){.    sqli
1c260 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1c270 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
1c280 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1c290 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20  UNCHANGED,0);.  
1c2a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1c2b0 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20  f this playback 
1c2c0 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74  is happening aut
1c2d0 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20  omatically as a 
1c2e0 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20  result of an IO 
1c2f0 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  or .  ** malloc 
1c300 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
1c310 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  red after the ch
1c320 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73  ange-counter was
1c330 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20   updated but .  
1c340 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  ** before the tr
1c350 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
1c360 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68  mmitted, then th
1c370 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1c380 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74   .  ** modificat
1c390 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76  ion may just hav
1c3a0 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e  e been reverted.
1c3b0 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
1c3c0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20   in exclusive . 
1c3d0 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73   ** mode, then s
1c3e0 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61  ubsequent transa
1c3f0 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ctions performed
1c400 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   by the connecti
1c410 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  on will not.  **
1c420 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
1c430 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c  ge-counter at al
1c440 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64  l. This may lead
1c450 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73   to cache incons
1c460 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f  istency.  ** pro
1c470 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20  blems for other 
1c480 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d  processes at som
1c490 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
1c4a0 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a  uture. So, just.
1c4b0 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69    ** in case thi
1c4c0 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
1c4d0 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65  clear the change
1c4e0 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e  CountDone flag n
1c4f0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ow..  */.  pPage
1c500 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1c510 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
1c520 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63  pFile;..  if( rc
1c530 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c540 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
1c550 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1c560 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
1c570 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1c580 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1c590 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1c5a0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1c5b0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1c5c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1c5d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c5e0 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67  E_OK.   && (pPag
1c5f0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1c600 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
1c610 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1c620 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20  ==PAGER_OPEN).  
1c630 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1c640 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50 61  te3PagerSync(pPa
1c650 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
1c660 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c670 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1c680 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
1c690 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b  pPager, zMaster[
1c6a0 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20  0]!='\0', 0);.  
1c6b0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1c6c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1c6d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c6e0 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1c6f0 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  0] && res ){.   
1c700 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
1c710 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1c720 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
1c730 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
1c740 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
1c750 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
1c760 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
1c770 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1c780 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  l..    */.    rc
1c790 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
1c7a0 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  er(pPager, zMast
1c7b0 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  er);.    testcas
1c7c0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1c7d0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   );.  }..  /* Th
1c7e0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1c7f0 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
1c800 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
1c810 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
1c820 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
1c830 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
1c840 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
1c850 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
1c860 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
1c870 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
1c880 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
1c890 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
1c8a0 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
1c8b0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
1c8c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c8d0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
1c8e0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65  content for page
1c8f0 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
1c900 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1c910 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  d into .** pPg->
1c920 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
1c930 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
1c940 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
1c950 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1c960 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
1c970 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1c980 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
1c990 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
1c9a0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
1c9b0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1c9c0 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
1c9d0 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
1c9e0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1c9f0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1ca00 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1ca10 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
1ca20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1ca30 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1ca40 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
1ca50 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1ca60 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1ca70 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1ca80 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
1ca90 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1caa0 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
1cab0 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
1cac0 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1cad0 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  pPg */.  Pgno pg
1cae0 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20  no = pPg->pgno; 
1caf0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
1cb00 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a  mber to read */.
1cb10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1cb20 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
1cb30 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1cb40 0a 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d  .  int isInWal =
1cb50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1cb60 2f 2a 20 54 72 75 65 20 69 66 20 70 61 67 65 20  /* True if page 
1cb70 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a  is in log file *
1cb80 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70  /.  int pgsz = p
1cb90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1cba0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1cbb0 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a  tes to read */..
1cbc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1cbd0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1cbe0 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42  READER && !MEMDB
1cbf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
1cc00 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1cc10 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
1cc20 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  (!isOpen(pPager-
1cc30 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73  >fd)) ){.    ass
1cc40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
1cc50 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d  pFile );.    mem
1cc60 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
1cc70 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
1cc80 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ize);.    return
1cc90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1cca0 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
1ccb0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
1ccc0 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c    /* Try to pull
1ccd0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1cce0 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  he write-ahead l
1ccf0 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  og. */.    rc = 
1cd00 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 28 70  sqlite3WalRead(p
1cd10 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
1cd20 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70 67 73  o, &isInWal, pgs
1cd30 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a  z, pPg->pData);.
1cd40 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1cd50 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73 49 6e  LITE_OK && !isIn
1cd60 57 61 6c 20 29 7b 0a 20 20 20 20 69 36 34 20 69  Wal ){.    i64 i
1cd70 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  Offset = (pgno-1
1cd80 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1cd90 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
1cda0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1cdb0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d  pPager->fd, pPg-
1cdc0 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f  >pData, pgsz, iO
1cdd0 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ffset);.    if( 
1cde0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1cdf0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1ce00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ce10 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
1ce20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1ce30 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1ce40 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
1ce50 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73  ead is unsuccess
1ce60 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46  ful, set the dbF
1ce70 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d  ileVers[] to som
1ce80 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ething.      ** 
1ce90 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  that will never 
1cea0 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20  be a valid file 
1ceb0 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65  version.  dbFile
1cec0 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79  Vers[] is a copy
1ced0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74  .      ** of byt
1cee0 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  es 24..39 of the
1cef0 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65   database.  Byte
1cf00 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20  s 28..31 should 
1cf10 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20  always be.      
1cf20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73  ** zero or the s
1cf30 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1cf40 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74  ase in page. Byt
1cf50 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35  es 32..35 and 35
1cf60 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68  ..39.      ** sh
1cf70 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d  ould be page num
1cf80 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e  bers which are n
1cf90 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e  ever 0xffffffff.
1cfa0 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20    So filling.   
1cfb0 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62     ** pPager->db
1cfc0 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20  FileVers[] with 
1cfd0 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73  all 0xff bytes s
1cfe0 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20  hould suffice.. 
1cff0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1d000 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65   For an encrypte
1d010 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  d database, the 
1d020 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72  situation is mor
1d030 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65  e complex:  byte
1d040 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33  s.      ** 24..3
1d050 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1d060 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73  e are white nois
1d070 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62  e.  But the prob
1d080 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20  ability of.     
1d090 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e   ** white noisin
1d0a0 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79  g equaling 16 by
1d0b0 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76  tes of 0xff is v
1d0c0 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
1d0d0 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20   so.      ** we 
1d0e0 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20  should still be 
1d0f0 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ok..      */.   
1d100 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72     memset(pPager
1d110 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78  ->dbFileVers, 0x
1d120 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  ff, sizeof(pPage
1d130 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1d140 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d150 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73    u8 *dbFileVers
1d160 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70   = &((u8*)pPg->p
1d170 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20  Data)[24];.     
1d180 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1d190 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
1d1a0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
1d1b0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d1c0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rs));.    }.  }.
1d1d0 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
1d1e0 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e   pPg->pData, pgn
1d1f0 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54  o, 3, rc = SQLIT
1d200 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47  E_NOMEM);..  PAG
1d210 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1d220 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
1d230 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  nt);.  PAGER_INC
1d240 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
1d250 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47  ;.  IOTRACE(("PG
1d260 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  IN %p %d\n", pPa
1d270 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50  ger, pgno));.  P
1d280 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54 43  AGERTRACE(("FETC
1d290 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  H %d page %d has
1d2a0 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1d2b0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1d2c0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
1d2d0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
1d2e0 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75  (pPg)));..  retu
1d2f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d300 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75 65  Update the value
1d310 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63   of the change-c
1d320 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74  ounter at offset
1d330 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a  s 24 and 92 in.*
1d340 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  * the header and
1d350 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72 73   the sqlite vers
1d360 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66  ion number at of
1d370 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54  fset 96..**.** T
1d380 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64  his is an uncond
1d390 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20  itional update. 
1d3a0 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61   See also the pa
1d3b0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1d3c0 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74  ounter().** rout
1d3d0 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75  ine which only u
1d3e0 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
1d3f0 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65  e-counter if the
1d400 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75 61   update is actua
1d410 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61  lly.** needed, a
1d420 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
1d430 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  the pPager->chan
1d440 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74  geCountDone stat
1d450 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
1d460 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
1d470 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1d480 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67 29  nter(PgHdr *pPg)
1d490 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  {.  u32 change_c
1d4a0 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e  ounter;..  /* In
1d4b0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
1d4c0 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
1d4d0 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
1d4e0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63   byte 24. */.  c
1d4f0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
1d500 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
1d510 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72  (u8*)pPg->pPager
1d520 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b  ->dbFileVers)+1;
1d530 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1d540 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1d550 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
1d560 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ter);..  /* Also
1d570 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74   store the SQLit
1d580 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1d590 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39   in bytes 96..99
1d5a0 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74   and in.  ** byt
1d5b0 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20  es 92..95 store 
1d5c0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1d5d0 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
1d5e0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a   version number.
1d5f0 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a    ** is valid. *
1d600 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  /.  put32bits(((
1d610 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1d620 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+92, change_cou
1d630 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69  nter);.  put32bi
1d640 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1d650 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54  pData)+96, SQLIT
1d660 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
1d670 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
1d680 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
1d690 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1d6a0 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  n is invoked onc
1d6b0 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  e for each page 
1d6c0 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
1d6d0 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65   been .** writte
1d6e0 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66  n into the log f
1d6f0 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74  ile when a WAL t
1d700 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1d710 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61  lled back..** Pa
1d720 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20 74  rameter iPg is t
1d730 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1d740 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68 65  f said page. The
1d750 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a   pCtx argument .
1d760 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  ** is actually a
1d770 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1d780 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e  Pager structure.
1d790 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69  .**.** If page i
1d7a0 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  Pg is present in
1d7b0 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20   the cache, and 
1d7c0 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
1d7d0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a  ng references,.*
1d7e0 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64 65  * it is discarde
1d7f0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1d800 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f   there are one o
1d810 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69  r more outstandi
1d820 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ng.** references
1d830 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
1d840 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66  nt is reloaded f
1d850 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1d860 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65  . If the.** atte
1d870 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f  mpt to reload co
1d880 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1d890 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75 69  atabase is requi
1d8a0 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a  red and fails, .
1d8b0 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
1d8c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
1d8d0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1d8e0 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
1d8f0 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  int pagerUndoCal
1d900 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78  lback(void *pCtx
1d910 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69  , Pgno iPg){.  i
1d920 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d930 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1d940 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43  er = (Pager *)pC
1d950 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  tx;.  PgHdr *pPg
1d960 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74  ;..  pPg = sqlit
1d970 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
1d980 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66  ager, iPg);.  if
1d990 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28  ( pPg ){.    if(
1d9a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
1d9b0 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d  geRefcount(pPg)=
1d9c0 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
1d9d0 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
1d9e0 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
1d9f0 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
1da00 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
1da10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1da20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
1da30 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
1da40 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPg);.      }.  
1da50 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1da60 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1da70 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  }.  }..  /* Norm
1da80 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73  ally, if a trans
1da90 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1daa0 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75   back, any backu
1dab0 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a  p processes are.
1dac0 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20    ** updated as 
1dad0 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f  data is copied o
1dae0 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  ut of the rollba
1daf0 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ck journal and i
1db00 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
1db10 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e  abase. This is n
1db20 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73  ot generally pos
1db30 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c  sible with a WAL
1db40 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20   database, as.  
1db50 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f  ** rollback invo
1db60 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e  lves simply trun
1db70 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66  cating the log f
1db80 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20  ile. Therefore, 
1db90 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d  if one.  ** or m
1dba0 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65 20  ore frames have 
1dbb0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1dbc0 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20  tten to the log 
1dbd0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a  (and therefore .
1dbe0 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64    ** also copied
1dbf0 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70   into the backup
1dc00 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20 70   databases) as p
1dc10 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  art of this tran
1dc20 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68  saction,.  ** th
1dc30 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62  e backups must b
1dc40 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a  e restarted..  *
1dc50 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75  /.  sqlite3Backu
1dc60 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
1dc70 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65  >pBackup);..  re
1dc80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1dc90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1dca0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c  is called to rol
1dcb0 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
1dcc0 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74  ion on a WAL dat
1dcd0 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1dce0 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61   int pagerRollba
1dcf0 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  ckWal(Pager *pPa
1dd00 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1dd30 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64  n Code */.  PgHd
1dd40 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20  r *pList;       
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1dd60 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
1dd70 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a  es to revert */.
1dd80 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61  .  /* For all pa
1dd90 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
1dda0 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
1ddb0 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61 76  tly dirty or hav
1ddc0 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62  e already.  ** b
1ddd0 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74  een written (but
1dde0 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20   not committed) 
1ddf0 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c  to the log file,
1de00 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a   do one of the .
1de10 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a    ** following:.
1de20 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69    **.  **   + Di
1de30 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65 64  scard the cached
1de40 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75   page (if refcou
1de50 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  nt==0), or.  ** 
1de60 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20    + Reload page 
1de70 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
1de80 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72 65   database (if re
1de90 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a  fcount>0)..  */.
1dea0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1deb0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   = pPager->dbOri
1dec0 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71  gSize;.  rc = sq
1ded0 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61  lite3WalUndo(pPa
1dee0 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72  ger->pWal, pager
1def0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76  UndoCallback, (v
1df00 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20  oid *)pPager);. 
1df10 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1df20 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1df30 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1df40 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ;.  while( pList
1df50 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1df60 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  K ){.    PgHdr *
1df70 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pNext = pList->p
1df80 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20  Dirty;.    rc = 
1df90 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1dfa0 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  k((void *)pPager
1dfb0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
1dfc0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78      pList = pNex
1dfd0 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
1dfe0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1dff0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1e000 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
1e010 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
1e020 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c  (). As well as l
1e030 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  ogging.** the co
1e040 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69  ntents of the li
1e050 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61 64  st of pages head
1e060 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e  ed by pList (con
1e070 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
1e080 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
1e090 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79  ion notifies any
1e0a0 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20 70   active backup p
1e0b0 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74 68  rocesses that th
1e0c0 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20  e pages have.** 
1e0d0 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  changed. .**.** 
1e0e0 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  The list of page
1e0f0 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  s passed into th
1e100 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c  is routine is al
1e110 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20 70  ways sorted by p
1e120 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48  age number..** H
1e130 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31 20  ence, if page 1 
1e140 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72 65  appears anywhere
1e150 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74   on the list, it
1e160 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72   will be the fir
1e170 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61  st page..*/ .sta
1e180 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c  tic int pagerWal
1e190 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20  Frames(.  Pager 
1e1a0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
1e1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1e1c0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50  er object */.  P
1e1d0 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20  gHdr *pList,    
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e1f0 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73  * List of frames
1e200 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e   to log */.  Pgn
1e210 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  o nTruncate,    
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e230 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66  Database size af
1e240 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20  ter this commit 
1e250 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
1e260 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1e270 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e280 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74  this is a commit
1e290 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1e2c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1e2d0 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20   nList;         
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e2f0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1e300 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 23 69 66 20  in pList */.#if 
1e310 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1e320 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1e330 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41  (SQLITE_CHECK_PA
1e340 47 45 53 29 0a 20 20 50 67 48 64 72 20 2a 70 3b  GES).  PgHdr *p;
1e350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e360 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1e370 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 73  oping over pages
1e380 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
1e390 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
1e3a0 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
1e3b0 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20  pList );.#ifdef 
1e3c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1e3d0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1e3e0 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20 69  e page list is i
1e3f0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
1e400 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69  r */.  for(p=pLi
1e410 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72  st; p && p->pDir
1e420 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29  ty; p=p->pDirty)
1e430 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
1e440 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74  >pgno < p->pDirt
1e450 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23  y->pgno );.  }.#
1e460 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1e470 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d   pList->pDirty==
1e480 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b  0 || isCommit );
1e490 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20  .  if( isCommit 
1e4a0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57  ){.    /* If a W
1e4b0 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  AL transaction i
1e4c0 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65  s being committe
1e4d0 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  d, there is no p
1e4e0 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a  oint in writing.
1e4f0 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73      ** any pages
1e500 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
1e510 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  rs greater than 
1e520 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74  nTruncate into t
1e530 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20  he WAL file..   
1e540 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65   ** They will ne
1e550 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20 61  ver be read by a
1e560 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65  ny client. So re
1e570 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74  move them from t
1e580 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a  he pDirty.    **
1e590 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20   list here. */. 
1e5a0 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
1e5b0 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
1e5c0 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
1e5d0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
1e5e0 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
1e5f0 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
1e600 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1e610 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
1e620 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1e630 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
1e640 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
1e650 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  List++;.      }.
1e660 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1e670 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  ( pList );.  }el
1e680 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  se{.    nList = 
1e690 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
1e6a0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
1e6b0 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73  T_WRITE] += nLis
1e6c0 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  t;..  if( pList-
1e6d0 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1e6e0 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1e6f0 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1e700 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1e710 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1e720 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1e730 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1e740 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1e750 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1e760 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1e770 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1e780 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1e790 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1e7a0 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
1e7b0 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1e7c0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1e7d0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
1e7e0 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
1e7f0 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20  ackup, p->pgno, 
1e800 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b  (u8 *)p->pData);
1e810 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
1e820 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1e830 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20  PAGES.  pList = 
1e840 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1e850 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1e860 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70  PCache);.  for(p
1e870 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
1e880 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67  pDirty){.    pag
1e890 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
1e8a0 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  p);.  }.#endif..
1e8b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e8c0 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65  /*.** Begin a re
1e8d0 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ad transaction o
1e8e0 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a  n the WAL..**.**
1e8f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   This routine us
1e900 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
1e910 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68  "pagerOpenSnapsh
1e920 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74  ot()" because it
1e930 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20   essentially.** 
1e940 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74  makes a snapshot
1e950 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e960 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
1e970 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e  point in time an
1e980 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74  d preserves.** t
1e990 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72  hat snapshot for
1e9a0 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64   use by the read
1e9b0 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63  er in spite of c
1e9c0 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e  oncurrently chan
1e9d0 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20  ges by.** other 
1e9e0 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b  writers or check
1e9f0 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  pointers..*/.sta
1ea00 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67  tic int pagerBeg
1ea10 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
1ea20 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
1ea30 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea50 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1ea60 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e  de */.  int chan
1ea70 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ged = 0;        
1ea80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ea90 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  if cache must be
1eaa0 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73   reset */..  ass
1eab0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
1eac0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
1ead0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1eae0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1eaf0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1eb00 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
1eb10 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65   );..  /* sqlite
1eb20 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
1eb30 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74  action() was not
1eb40 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
1eb50 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72  previous.  ** tr
1eb60 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63  ansaction in loc
1eb70 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
1eb80 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74  IVE.  So call it
1eb90 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a   now.  If we.  *
1eba0 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67  * are in locking
1ebb0 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64  _mode=NORMAL and
1ebc0 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70   EndRead() was p
1ebd0 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
1ebe0 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69  ,.  ** the dupli
1ebf0 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72  cate call is har
1ec00 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  mless..  */.  sq
1ec10 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
1ec20 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1ec30 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20  r->pWal);..  rc 
1ec40 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
1ec50 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
1ec60 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26  (pPager->pWal, &
1ec70 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20  changed);.  if( 
1ec80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1ec90 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20   changed ){.    
1eca0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1ecb0 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  er);.  }..  retu
1ecc0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1ecd0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1ece0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
1ecf0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72  s part of the tr
1ed00 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41  ansition from PA
1ed10 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50  GER_OPEN.** to P
1ed20 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
1ed30 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
1ed40 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1ed50 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20  atabase file.** 
1ed60 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69  in pages (assumi
1ed70 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ng the page size
1ed80 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1ed90 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53  d in Pager.pageS
1eda0 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ize)..**.** If n
1edb0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1edc0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1edd0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69  urned and the si
1ede0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1edf0 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69  se.** in pages i
1ee00 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50  s stored in *pnP
1ee10 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
1ee20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70  an error code (p
1ee30 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45  erhaps.** SQLITE
1ee40 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73  _IOERR_FSTAT) is
1ee50 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1ee60 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e  nPage is left un
1ee70 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61  modified..*/.sta
1ee80 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67  tic int pagerPag
1ee90 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
1eea0 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61  ager, Pgno *pnPa
1eeb0 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ge){.  Pgno nPag
1eec0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1eed0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1eee0 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70  to return via *p
1eef0 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51  nPage */..  /* Q
1ef00 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62  uery the WAL sub
1ef10 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
1ef20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54  database size. T
1ef30 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20  he WalDbsize(). 
1ef40 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74   ** function ret
1ef50 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65  urns zero if the
1ef60 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e   WAL is not open
1ef70 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61   (i.e. Pager.pWa
1ef80 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69  l==0), or.  ** i
1ef90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1efa0 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ize is not avail
1efb0 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61  able. The databa
1efc0 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20  se size is not. 
1efd0 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72   ** available fr
1efe0 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1eff0 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67  ystem if the log
1f000 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f   file is empty o
1f010 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  r.  ** contains 
1f020 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74  no valid committ
1f030 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ed transactions.
1f040 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1f050 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1f060 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
1f070 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f080 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
1f090 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20  CK );.  nPage = 
1f0a0 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65  sqlite3WalDbsize
1f0b0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1f0c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
1f0d0 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 6e  abase size was n
1f0e0 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  ot available fro
1f0f0 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  m the WAL sub-sy
1f100 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72  stem,.  ** deter
1f110 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f 6e  mine it based on
1f120 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1f130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1f140 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a  If the size.  **
1f150 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f160 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20   file is not an 
1f170 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
1f180 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
1f190 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f  e,.  ** round do
1f1a0 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73  wn to the neares
1f1b0 74 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c 20  t page. Except, 
1f1c0 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72 20  any file larger 
1f1d0 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65  than 0.  ** byte
1f1e0 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
1f1f0 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74 61  sidered to conta
1f200 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  in at least one 
1f210 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
1f220 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
1f230 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f250 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c  * Size of db fil
1f260 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1f270 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1f280 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1f290 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1f2a0 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
1f2b0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1f2c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
1f2d0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1f2e0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
1f2f0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
1f300 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f310 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1f320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f330 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1f340 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61  o)((n+pPager->pa
1f350 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67  geSize-1) / pPag
1f360 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1f370 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1f380 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  current number o
1f390 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
1f3a0 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ile is greater t
1f3b0 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  han the.  ** con
1f3c0 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20  figured maximum 
1f3d0 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e  pager number, in
1f3e0 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77  crease the allow
1f3f0 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a  ed limit so.  **
1f400 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
1f410 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f  an be read..  */
1f420 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61  .  if( nPage>pPa
1f430 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
1f440 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
1f450 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b  o = (Pgno)nPage;
1f460 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20  .  }..  *pnPage 
1f470 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1f480 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f490 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f4a0 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68  MIT_WAL./*.** Ch
1f4b0 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c  eck if the *-wal
1f4c0 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65   file that corre
1f4d0 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61  sponds to the da
1f4e0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1f4f0 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74   pPager.** exist
1f500 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  s if the databas
1f510 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f  e is not empy, o
1f520 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  r verify that th
1f530 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
1f540 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28  s.** not exist (
1f550 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20  by deleting it) 
1f560 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1f570 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  file is empty..*
1f580 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
1f590 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74  base is not empt
1f5a0 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20  y and the *-wal 
1f5b0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65  file exists, ope
1f5c0 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69  n the pager.** i
1f5d0 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20  n WAL mode.  If 
1f5e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1f5f0 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a  empty or if no *
1f600 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  -wal file exists
1f610 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72   and.** if no er
1f620 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65  ror occurs, make
1f630 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72   sure Pager.jour
1f640 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73  nalMode is not s
1f650 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a  et to.** PAGER_J
1f660 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a  OURNALMODE_WAL..
1f670 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1f680 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72  ITE_OK or an err
1f690 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
1f6a0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68  he caller must h
1f6b0 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63  old a SHARED loc
1f6c0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1f6d0 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e file to call t
1f6e0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  his.** function.
1f6f0 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c   Because an EXCL
1f700 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1f710 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71  e db file is req
1f720 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20  uired to delete 
1f730 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e  .** a WAL on a n
1f740 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61  one-empty databa
1f750 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  se, this ensures
1f760 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63   there is no rac
1f770 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  e condition .** 
1f780 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63  between the xAcc
1f790 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20  ess() below and 
1f7a0 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69  an xDelete() bei
1f7b0 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73  ng executed by s
1f7c0 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f  ome .** other co
1f7d0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
1f7e0 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
1f7f0 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61  nWalIfPresent(Pa
1f800 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1f810 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f820 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
1f830 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1f840 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
1f850 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
1f860 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
1f870 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
1f880 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
1f890 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20      int isWal;  
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c    /* True if WAL
1f8c0 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
1f8d0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8f0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1f900 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1f910 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  /..    rc = page
1f920 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1f930 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
1f940 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f950 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67  rc;.    if( nPag
1f960 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
1f970 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
1f980 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
1f990 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30   pPager->zWal, 0
1f9a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1f9b0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  =SQLITE_IOERR_DE
1f9c0 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20  LETE_NOENT ) rc 
1f9d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1f9e0 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20     isWal = 0;.  
1f9f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1fa00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1fa10 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70  ess(.          p
1fa20 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
1fa30 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54  ger->zWal, SQLIT
1fa40 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1fa50 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b   &isWal.      );
1fa60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1fa70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1fa80 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20        if( isWal 
1fa90 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
1faa0 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63  ase( sqlite3Pcac
1fab0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
1fac0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
1fad0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1fae0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
1faf0 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  Wal(pPager, 0);.
1fb00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1fb10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1fb20 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
1fb30 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20  ALMODE_WAL ){.  
1fb40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1fb50 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
1fb60 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
1fb70 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LETE;.      }.  
1fb80 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1fb90 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
1fba0 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61  *.** Playback sa
1fbb0 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69  vepoint pSavepoi
1fbc0 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65  nt. Or, if pSave
1fbd0 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65  point==NULL, the
1fbe0 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68  n playback.** th
1fbf0 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
1fc00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
1fc10 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e  e case pSavepoin
1fc20 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77  t==NULL occurs w
1fc30 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41  hen .** a ROLLBA
1fc40 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73  CK TO command is
1fc50 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41   invoked on a SA
1fc60 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20  VEPOINT that is 
1fc70 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
1fc80 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a  * savepoint..**.
1fc90 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69  ** When pSavepoi
1fca0 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28  nt is not NULL (
1fcb0 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72  meaning a non-tr
1fcc0 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
1fcd0 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67  int is .** being
1fce0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74   rolled back), t
1fcf0 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
1fd00 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20   consists of up 
1fd10 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c  to three stages,
1fd20 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e  .** performed in
1fd30 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69   the order speci
1fd40 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  fied:.**.**   * 
1fd50 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  Pages are played
1fd60 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
1fd70 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
1fd80 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20  ting at byte.** 
1fd90 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72      offset Pager
1fda0 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
1fdb0 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
1fdc0 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65   to .**     Page
1fdd0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
1fde0 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65  ffset, or to the
1fdf0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
1fe00 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
1fe10 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76  file if PagerSav
1fe20 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
1fe30 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  t is zero..**.**
1fe40 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76     * If PagerSav
1fe50 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
1fe60 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
1fe70 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c  hen pages are pl
1fe80 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b  ayed.**     back
1fe90 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74   starting from t
1fea0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1feb0 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  r immediately fo
1fec0 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20  llowing .**     
1fed0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1fee0 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65  HdrOffset to the
1fef0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
1ff00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
1ff10 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61  *.**   * Pages a
1ff20 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62  re then played b
1ff30 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ack from the sub
1ff40 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73  -journal file, s
1ff50 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77  tarting.**     w
1ff60 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76  ith the PagerSav
1ff70 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61  epoint.iSubRec a
1ff80 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
1ff90 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20   the end of.**  
1ffa0 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
1ffb0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75  ile..**.** Throu
1ffc0 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61  ghout the rollba
1ffd0 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68  ck process, each
1ffe0 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
1fff0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
20000 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
20010 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
20020 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  a bitvec structu
20030 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f  re (variable pDo
20040 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70  ne in the.** imp
20050 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f  lementation belo
20060 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  w). This is used
20070 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
20080 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a  a page is only.*
20090 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  * rolled back th
200a0 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20  e first time it 
200b0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
200c0 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c  n either journal
200d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65  ..**.** If pSave
200e0 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  point is NULL, t
200f0 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e  hen pages are on
20100 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  ly played back f
20110 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20  rom the main.** 
20120 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
20130 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
20140 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74  or a bitvec in t
20150 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
20160 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
20170 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20  before playback 
20180 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61  commences the Pa
20190 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61  ger.dbSize varia
201a0 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20  ble.** is reset 
201b0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61  to the value tha
201c0 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65  t it held at the
201d0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61   start of the sa
201e0 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20  vepoint .** (or 
201f0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f  transaction). No
20200 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67   page with a pag
20210 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e-number greater
20220 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
20230 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61  .** is played ba
20240 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e  ck. If one is en
20250 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
20260 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a  simply skipped..
20270 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
20280 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
20290 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
202a0 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69  er, PagerSavepoi
202b0 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b  nt *pSavepoint){
202c0 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
202d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
202e0 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
202f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20300 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  l */.  i64 iHdrO
20310 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
20320 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20  /* End of first 
20330 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d  segment of main-
20340 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
20350 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
20360 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
20370 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
20380 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20    Bitvec *pDone 
20390 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69  = 0;       /* Bi
203a0 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70  tvec to ensure p
203b0 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b  ages played back
203c0 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20   only once */.. 
203d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
203e0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
203f0 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
20400 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20410 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
20420 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41  OCKED );..  /* A
20430 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63  llocate a bitvec
20440 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65   to use to store
20450 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   the set of page
20460 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f  s rolled back */
20470 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
20480 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d  t ){.    pDone =
20490 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
204a0 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d  eate(pSavepoint-
204b0 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28  >nOrig);.    if(
204c0 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20   !pDone ){.     
204d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
204e0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
204f0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61  .  /* Set the da
20500 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b  tabase size back
20510 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
20520 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20   was before the 
20530 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
20540 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77  being reverted w
20550 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  as opened..  */.
20560 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
20570 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20   = pSavepoint ? 
20580 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
20590 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  g : pPager->dbOr
205a0 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  igSize;.  pPager
205b0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
205c0 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
205d0 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53  File;..  if( !pS
205e0 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65  avepoint && page
205f0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
20600 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  ){.    return pa
20610 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70  gerRollbackWal(p
20620 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
20630 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f  * Use pPager->jo
20640 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20  urnalOff as the 
20650 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  effective size o
20660 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  f the main rollb
20670 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
20680 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69  .  The actual fi
20690 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  le might be larg
206a0 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a  er than this in.
206b0 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e    ** PAGER_JOURN
206c0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
206d0 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  or PAGER_JOURNAL
206e0 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42  MODE_PERSIST.  B
206f0 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a  ut anything.  **
20700 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f   past pPager->jo
20710 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d  urnalOff is off-
20720 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20  limits to us..  
20730 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  */.  szJ = pPage
20740 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
20750 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
20760 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
20770 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20  || szJ==0 );..  
20780 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c  /* Begin by roll
20790 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
207a0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
207b0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
207c0 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  at.  ** PagerSav
207d0 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
207e0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
207f0 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
20800 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54  l header..  ** T
20810 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65  here might be re
20820 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69  cords in the mai
20830 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68  n journal that h
20840 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ave a page numbe
20850 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74  r.  ** greater t
20860 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
20870 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70  database size (p
20880 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62  Pager->dbSize) b
20890 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69  ut those.  ** wi
208a0 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75  ll be skipped au
208b0 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61  tomatically.  Pa
208c0 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  ges are added to
208d0 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20   pDone as they. 
208e0 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62   ** are played b
208f0 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ack..  */.  if( 
20900 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  pSavepoint && !p
20910 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
20920 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66  r) ){.    iHdrOf
20930 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
20940 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61  iHdrOffset ? pSa
20950 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
20960 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70  set : szJ;.    p
20970 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20980 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
20990 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69  iOffset;.    whi
209a0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
209b0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
209c0 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20  rnalOff<iHdrOff 
209d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
209e0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
209f0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
20a00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20a10 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
20a20 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
20a30 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
20a40 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NE );.  }else{. 
20a50 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
20a60 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a  alOff = 0;.  }..
20a70 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f    /* Continue ro
20a80 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
20a90 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ds out of the ma
20aa0 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
20ab0 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ing at.  ** the 
20ac0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
20ad0 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f  ader seen and co
20ae0 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74  ntinuing until t
20af0 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64  he effective end
20b00 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69  .  ** of the mai
20b10 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  n journal file. 
20b20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69   Continue to ski
20b30 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70  p out-of-range p
20b40 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f  ages and.  ** co
20b50 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61  ntinue adding pa
20b60 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
20b70 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  to pDone..  */. 
20b80 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
20b90 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
20ba0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20  >journalOff<szJ 
20bb0 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
20bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
20bd0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
20be0 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20   u32 nJRec = 0; 
20bf0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20c00 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
20c10 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
20c20 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
20c30 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
20c40 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65  r, 0, szJ, &nJRe
20c50 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
20c60 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
20c70 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20  TE_DONE );..    
20c80 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70  /*.    ** The "p
20c90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
20ca0 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
20cb0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
20cc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20  ->journalOff".  
20cd0 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c    ** test is rel
20ce0 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23  ated to ticket #
20cf0 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64  2565.  See the d
20d00 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65  iscussion in the
20d10 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c  .    ** pager_pl
20d20 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f  ayback() functio
20d30 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  n for additional
20d40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
20d50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52    */.    if( nJR
20d60 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  ec==0 .     && p
20d70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
20d80 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
20d90 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
20da0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20  ->journalOff.   
20db0 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
20dc0 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70  = (u32)((szJ - p
20dd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20de0 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  f)/JOURNAL_PG_SZ
20df0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
20e00 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72  .    for(ii=0; r
20e10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20e20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67  ii<nJRec && pPag
20e30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
20e40 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  zJ; ii++){.     
20e50 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
20e60 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
20e70 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
20e80 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
20e90 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
20ea0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
20eb0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
20ec0 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
20ed0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
20ee0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
20ef0 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  =szJ );..  /* Fi
20f00 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b  nally,  rollback
20f10 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
20f20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61  sub-journal.  Pa
20f30 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a  ge that were.  *
20f40 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c  * previously rol
20f50 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20  led back out of 
20f60 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20f70 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20   (and are hence 
20f80 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77  in pDone).  ** w
20f90 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20  ill be skipped. 
20fa0 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   Out-of-range pa
20fb0 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69  ges are also ski
20fc0 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  pped..  */.  if(
20fd0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
20fe0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
20ff0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
21000 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34  unter */.    i64
21010 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70   offset = (i64)p
21020 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
21030 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
21040 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66  geSize);..    if
21050 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
21060 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
21070 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61  c = sqlite3WalSa
21080 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67  vepointUndo(pPag
21090 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70  er->pWal, pSavep
210a0 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b  oint->aWalData);
210b0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
210c0 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
210d0 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
210e0 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65  E_OK && ii<pPage
210f0 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b  r->nSubRec; ii++
21100 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21110 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69   offset==(i64)ii
21120 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
21130 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72  Size) );.      r
21140 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
21150 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
21160 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f  er, &offset, pDo
21170 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 0, 1);.    }
21180 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
21190 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
211a0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69    }..  sqlite3Bi
211b0 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e  tvecDestroy(pDon
211c0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
211d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
211e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
211f0 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20  f = szJ;.  }..  
21200 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21210 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
21220 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
21230 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
21240 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
21250 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
21260 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
21270 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
21280 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
21290 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
212a0 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
212b0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
212c0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  age);.}../*.** F
212d0 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
212e0 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
212f0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  rom the pager..*
21300 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
21310 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20  gerShrink(Pager 
21320 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
21330 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28  te3PcacheShrink(
21340 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
21350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
21360 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
21370 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21380 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
21390 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
213a0 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
213b0 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
213c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
213d0 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
213e0 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
213f0 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
21400 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
21410 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
21420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
21430 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
21440 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
21450 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
21470 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
21480 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
21490 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
214a0 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
214b0 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
214c0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
214d0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
214e0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
214f0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
21500 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
21510 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
21530 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
21540 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
21550 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
21560 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
21570 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
21580 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
21590 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
215a0 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
215b0 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
215c0 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
215d0 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
215e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
215f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
21600 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
21610 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
21620 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
21630 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
21640 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
21650 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
21660 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21670 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
21680 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
21690 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
216a0 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
216b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
216c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
216d0 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
216e0 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
216f0 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
21700 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
21710 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
21720 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
21730 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
21740 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
21750 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
21760 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
21770 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21780 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
21790 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
217a0 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
217b0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
217c0 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
217d0 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
217e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
217f0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
21800 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  ..**.** The abov
21810 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62  e is for a rollb
21820 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ack-journal mode
21830 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c  .  For WAL mode,
21840 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a   OFF continues.*
21850 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e  * to mean that n
21860 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63  o syncs ever occ
21870 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e  ur.  NORMAL mean
21880 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69  s that the WAL i
21890 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f  s synced.** prio
218a0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
218b0 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64  f checkpoint and
218c0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
218d0 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  se file is synce
218e0 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  d.** at the conc
218f0 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68  lusion of the ch
21900 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
21910 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
21920 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73  f the WAL.** was
21930 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
21940 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
21950 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70    But no sync op
21960 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66  erations occur f
21970 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  or.** an ordinar
21980 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d  y commit in NORM
21990 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c  AL mode with WAL
219a0 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68  .  FULL means th
219b0 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69  at the WAL.** fi
219c0 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c  le is synced fol
219d0 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d  lowing each comm
219e0 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e  it operation, in
219f0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
21a00 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69  .** syncs associ
21a10 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c  ated with NORMAL
21a20 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63  ..**.** Do not c
21a30 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f  onfuse synchrono
21a40 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c  us=FULL with SQL
21a50 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20  ITE_SYNC_FULL.  
21a60 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59  The.** SQLITE_SY
21a70 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65  NC_FULL macro me
21a80 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d  ans to use the M
21a90 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c  acOSX-style full
21aa0 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20  -fsync.** using 
21ab0 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e  fcntl(F_FULLFSYN
21ac0 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43  C).  SQLITE_SYNC
21ad0 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f  _NORMAL means to
21ae0 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61   do an.** ordina
21af0 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e  ry fsync() call.
21b00 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
21b10 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
21b20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
21b30 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f  L.** and SQLITE_
21b40 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70  SYNC_NORMAL on p
21b50 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74  latforms other t
21b60 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74  han MacOSX.  But
21b70 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e   the.** synchron
21b80 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20  ous=FULL versus 
21b90 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
21ba0 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72  AL setting deter
21bb0 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68  mines when.** th
21bc0 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76  e xSync primitiv
21bd0 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20  e is called and 
21be0 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61  is relevant to a
21bf0 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a  ll platforms..**
21c00 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
21c10 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
21c20 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
21c30 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
21c40 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
21c50 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
21c60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
21c70 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
21c80 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
21c90 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67  fetyLevel(.  Pag
21ca0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
21cb0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
21cc0 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65  to set safety le
21cd0 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  vel for */.  int
21ce0 20 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20   level,         
21cf0 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e     /* PRAGMA syn
21d00 63 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46  chronous.  1=OFF
21d10 2c 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55  , 2=NORMAL, 3=FU
21d20 4c 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46  LL */  .  int bF
21d30 75 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20  ullFsync,       
21d40 2f 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73  /* PRAGMA fullfs
21d50 79 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b  ync */.  int bCk
21d60 70 74 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f  ptFullFsync    /
21d70 2a 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f  * PRAGMA checkpo
21d80 69 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f  int_fullfsync */
21d90 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65  .){.  assert( le
21da0 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c  vel>=1 && level<
21db0 3d 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =3 );.  pPager->
21dc0 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c  noSync =  (level
21dd0 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
21de0 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
21df0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
21e00 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26  c = (level==3 &&
21e10 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
21e20 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20  le) ?1:0;.  if( 
21e30 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
21e40 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
21e50 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  ncFlags = 0;.   
21e60 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
21e70 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65  cFlags = 0;.  }e
21e80 6c 73 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79  lse if( bFullFsy
21e90 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
21ea0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
21eb0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
21ec0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
21ed0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
21ee0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
21ef0 7d 65 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46  }else if( bCkptF
21f00 75 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20  ullFsync ){.    
21f10 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
21f20 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
21f30 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
21f40 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
21f50 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
21f60 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  FULL;.  }else{. 
21f70 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
21f80 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
21f90 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
21fa0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
21fb0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
21fc0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  NC_NORMAL;.  }. 
21fd0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
21fe0 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e  Flags = pPager->
21ff0 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28  syncFlags;.  if(
22000 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
22010 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
22020 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d  >walSyncFlags |=
22030 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41   WAL_SYNC_TRANSA
22040 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 7d 0a 23 65  CTIONS;.  }.}.#e
22050 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
22060 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
22070 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
22080 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
22090 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
220a0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
220b0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
220c0 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
220d0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
220e0 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
220f0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
22100 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
22110 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
22120 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
22130 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
22140 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
22150 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a  porary file..**.
22160 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
22170 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
22180 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e  o *pFile. Return
22190 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
221a0 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d  ccess .** or som
221b0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
221c0 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
221d0 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
221e0 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c  atically .** del
221f0 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
22200 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
22210 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
22220 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64  The flags passed
22230 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65   to the VFS laye
22240 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61  r xOpen() call a
22250 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  re those specifi
22260 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74  ed.** by paramet
22270 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64  er vfsFlags ORed
22280 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
22290 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ing:.**.**     S
222a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
222b0 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  RITE.**     SQLI
222c0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a  TE_OPEN_CREATE.*
222d0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
222e0 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  N_EXCLUSIVE.**  
222f0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
22300 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a  ELETEONCLOSE.*/.
22310 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
22320 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65  Opentemp(.  Page
22330 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
22340 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
22350 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
22360 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
22370 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
22380 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
22390 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  re */.  int vfsF
223a0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a  lags          /*
223b0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
223c0 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53  rough to the VFS
223d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
223f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
22400 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
22410 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
22420 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
22430 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
22440 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
22450 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
22460 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d  f..  vfsFlags |=
22470 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
22480 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
22490 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
224a0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
224b0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
224c0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
224d0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
224e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
224f0 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
22500 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c   0, pFile, vfsFl
22510 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ags, 0);.  asser
22520 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
22530 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65   || isOpen(pFile
22540 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
22550 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
22560 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
22570 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
22580 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65  The pager invoke
22590 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  s the busy-handl
225a0 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c  er if sqlite3OsL
225b0 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a  ock() returns .*
225c0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68  * SQLITE_BUSY wh
225d0 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
225e0 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63  rade from no-loc
225f0 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  k to a SHARED lo
22600 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74  ck,.** or when t
22610 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
22620 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
22630 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c   lock to an EXCL
22640 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  USIVE .** lock. 
22650 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e  It does *not* in
22660 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
22670 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61  ndler when upgra
22680 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41  ding from.** SHA
22690 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c  RED to RESERVED,
226a0 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69   or when upgradi
226b0 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ng from SHARED t
226c0 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28  o EXCLUSIVE.** (
226d0 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72  which occurs dur
226e0 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ing hot-journal 
226f0 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61  rollback). Summa
22700 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e  ry:.**.**   Tran
22710 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20  sition          
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
22730 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e  Invokes xBusyHan
22740 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  dler.**   ------
22750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22780 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20  --.**   NO_LOCK 
22790 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f        -> SHARED_
227a0 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a  LOCK      | Yes.
227b0 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
227c0 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c     -> RESERVED_L
227d0 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  OCK    | No.**  
227e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
227f0 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
22800 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53     | No.**   RES
22810 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58  ERVED_LOCK -> EX
22820 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
22830 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   Yes.**.** If th
22840 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  e busy-handler c
22850 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
22860 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
22870 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65  ck is .** retrie
22880 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  d. If it returns
22890 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
228a0 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
228b0 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  r is.** returned
228c0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f   to the caller o
228d0 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20  f the pager API 
228e0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
228f0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
22900 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20  tBusyhandler(.  
22910 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
22940 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ject */.  int (*
22950 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
22960 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f  id *),         /
22970 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
22980 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
22990 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
229a0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20  usyHandlerArg   
229b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
229c0 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  Argument to pass
229d0 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72   to xBusyHandler
229e0 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d   */.){.  pPager-
229f0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
22a00 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
22a10 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
22a20 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48  dlerArg = pBusyH
22a30 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66  andlerArg;..  if
22a40 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
22a50 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64  >fd) ){.    void
22a60 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a   **ap = (void **
22a70 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  )&pPager->xBusyH
22a80 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65  andler;.    asse
22a90 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69  rt( ((int(*)(voi
22aa0 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78  d *))(ap[0]))==x
22ab0 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20  BusyHandler );. 
22ac0 20 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d     assert( ap[1]
22ad0 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ==pBusyHandlerAr
22ae0 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g );.    sqlite3
22af0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
22b00 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
22b10 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48  LITE_FCNTL_BUSYH
22b20 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29  ANDLER, (void *)
22b30 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
22b40 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
22b50 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
22b60 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
22b70 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   The new page si
22b80 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  ze .** is passed
22b90 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   in *pPageSize..
22ba0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
22bb0 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
22bc0 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
22bd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
22be0 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20  alled, it.** is 
22bf0 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c  a no-op. The val
22c00 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
22c10 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
22c20 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
22c30 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  .** one of SQLIT
22c40 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49  E_IOERR, an SQLI
22c50 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62  TE_IOERR_xxx sub
22c60 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f  -code or SQLITE_
22c70 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  FULL)..**.** Oth
22c80 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f  erwise, if all o
22c90 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
22ca0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
22cb0 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65    * the new page
22cc0 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20   size (value of 
22cd0 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76  *pPageSize) is v
22ce0 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a  alid (a power .*
22cf0 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74  *     of two bet
22d00 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c  ween 512 and SQL
22d10 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
22d20 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61  E, inclusive), a
22d30 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
22d40 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
22d50 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
22d60 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  ences, and.**.**
22d70 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
22d80 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20  e is either not 
22d90 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
22da0 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a  abase or it is.*
22db0 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f  *     an in-memo
22dc0 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
22dd0 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69   currently consi
22de0 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65  sts of zero page
22df0 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68  s..**.** then th
22e00 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e pager object p
22e10 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
22e20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  to *pPageSize..*
22e30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
22e40 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64   size is changed
22e50 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
22e60 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65  tion uses sqlite
22e70 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a  3PagerMalloc() .
22e80 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e  ** to obtain a n
22e90 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  ew Pager.pTmpSpa
22ea0 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68  ce buffer. If th
22eb0 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  is allocation at
22ec0 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c  tempt .** fails,
22ed0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
22ee0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
22ef0 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61  e page size rema
22f00 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a  ins unchanged. .
22f10 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ** In all other 
22f20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  cases, SQLITE_OK
22f30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
22f40 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
22f50 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  size is not chan
22f60 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61  ged, either beca
22f70 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65  use one of the e
22f80 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e  numerated.** con
22f90 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73  ditions above is
22fa0 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70   not true, the p
22fb0 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f  ager was in erro
22fc0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
22fd0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61  s.** function wa
22fe0 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63  s called, or bec
22ff0 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ause the memory 
23000 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
23010 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74  pt failed, .** t
23020 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69  hen *pPageSize i
23030 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64  s set to the old
23040 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20  , retained page 
23050 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75  size before retu
23060 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
23070 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
23080 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
23090 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53  ger, u32 *pPageS
230a0 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
230b0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
230c0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
230d0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
230e0 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20  le to do a full 
230f0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
23100 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68  te() here, as th
23110 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
23120 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66   may be called f
23130 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72  rom within Pager
23140 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74  Open(), before t
23150 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66  he state.  ** of
23160 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
23170 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  t is internally 
23180 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a  consistent..  **
23190 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69  .  ** At one poi
231a0 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nt this function
231b0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
231c0 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20  or if the pager 
231d0 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47  was in .  ** PAG
231e0 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
231f0 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f  But since PAGER_
23200 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72  ERROR state guar
23210 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a  antees that.  **
23220 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61   there is at lea
23230 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
23240 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
23250 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
23260 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  .  ** is a no-op
23270 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61   for that case a
23280 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75  nyhow..  */..  u
23290 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  32 pageSize = *p
232a0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
232b0 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
232c0 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
232d0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
232e0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
232f0 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70  IZE) );.  if( (p
23300 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
23310 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
23320 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69  e==0).   && sqli
23330 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
23340 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
23350 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67  e)==0 .   && pag
23360 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
23370 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e  e!=(u32)pPager->
23380 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20  pageSize .  ){. 
23390 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
233a0 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20  NULL;           
233b0 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70    /* New temp sp
233c0 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e  ace */.    i64 n
233d0 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69  Byte = 0;..    i
233e0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
233f0 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  e>PAGER_OPEN && 
23400 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
23410 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  d) ){.      rc =
23420 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
23430 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
23440 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
23450 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23460 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  _OK ){.      pNe
23470 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  w = (char *)sqli
23480 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61  te3PageMalloc(pa
23490 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
234a0 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20  f( !pNew ) rc = 
234b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
234c0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
234d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
234e0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
234f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
23500 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
23510 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61  (Pgno)((nByte+pa
23520 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69  geSize-1)/pageSi
23530 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
23540 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
23550 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71  geSize;.      sq
23560 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
23570 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
23580 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
23590 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77  pTmpSpace = pNew
235a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
235b0 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65  cacheSetPageSize
235c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
235d0 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  , pageSize);.   
235e0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65   }.  }..  *pPage
235f0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
23600 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72  ageSize;.  if( r
23610 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23620 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65      if( nReserve
23630 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20  <0 ) nReserve = 
23640 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
23650 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52  ;.    assert( nR
23660 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
23670 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20  serve<1000 );.  
23680 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72    pPager->nReser
23690 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72  ve = (i16)nReser
236a0 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  ve;.    pagerRep
236b0 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
236c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
236d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
236e0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
236f0 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
23700 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
23710 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
23720 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
23730 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
23740 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
23750 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
23760 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
23770 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
23780 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
23790 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
237a0 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
237b0 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
237c0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
237d0 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
237e0 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
237f0 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
23800 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
23810 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
23820 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
23830 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
23840 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
23850 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
23860 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
23870 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
23880 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
23890 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
238a0 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
238b0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
238c0 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
238d0 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
238e0 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
238f0 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
23900 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
23910 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
23920 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
23930 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
23940 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
23950 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
23960 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
23970 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
23980 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
23990 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
239a0 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
239b0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
239c0 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
239d0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
239e0 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  {.  if( mxPage>0
239f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
23a00 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
23a10 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
23a20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
23a30 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20  AGER_OPEN );    
23a40 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79    /* Called only
23a50 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   by OP_MaxPgcnt 
23a60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
23a70 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61  ger->mxPgno>=pPa
23a80 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20  ger->dbSize );  
23a90 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65  /* OP_MaxPgcnt e
23aa0 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a  nforces this */.
23ab0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
23ac0 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mxPgno;.}../*.*
23ad0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
23ae0 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
23af0 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
23b00 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
23b10 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
23b20 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
23b30 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
23b40 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
23b50 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
23b60 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
23b70 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
23b80 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
23b90 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
23ba0 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
23bb0 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
23bc0 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
23bd0 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
23be0 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
23bf0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
23c00 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
23c10 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
23c20 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
23c30 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
23c40 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
23c50 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
23c60 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
23c70 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
23c80 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20  d){.  saved_cnt 
23c90 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
23ca0 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71  or_pending;.  sq
23cb0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
23cc0 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76  ending = -1;.}.v
23cd0 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  oid enable_simul
23ce0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
23cf0 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
23d00 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
23d10 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a   = saved_cnt;.}.
23d20 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64  #else.# define d
23d30 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
23d40 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
23d50 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
23d60 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
23d70 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
23d80 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
23d90 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
23da0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
23db0 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
23dc0 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
23dd0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
23de0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
23df0 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
23e00 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28  transient file (
23e10 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20  zFilename==""), 
23e20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20  or.** opened on 
23e30 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e  a file less than
23e40 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   N bytes in size
23e50 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  , the output buf
23e60 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64  fer is.** zeroed
23e70 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
23e80 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74  eturned. The rat
23e90 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20  ionale for this 
23ea0 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a  is that this .**
23eb0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
23ec0 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  d to read databa
23ed0 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20  se headers, and 
23ee0 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20  a new transient 
23ef0 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64  or.** zero sized
23f00 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20   database has a 
23f10 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73  header than cons
23f20 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
23f30 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   zeroes..**.** I
23f40 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61  f any IO error a
23f50 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45  part from SQLITE
23f60 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
23f70 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  D is encountered
23f80 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63  ,.** the error c
23f90 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
23fa0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e  to the caller an
23fb0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
23fc0 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20  f the.** output 
23fd0 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64  buffer undefined
23fe0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23ff0 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
24000 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
24010 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
24020 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
24030 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24040 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
24050 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
24060 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
24070 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
24080 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
24090 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
240a0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
240b0 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d  led by btree imm
240c0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63  ediately after c
240d0 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
240e0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20   Pager object.  
240f0 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65  There has not be
24100 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  en an opportunit
24110 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a  y to transition.
24120 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65    ** to WAL mode
24130 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   yet..  */.  ass
24140 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
24150 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
24160 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
24170 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f  r->fd) ){.    IO
24180 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
24190 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
241a0 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
241b0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
241c0 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
241d0 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
241e0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
241f0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
24200 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24210 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
24220 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24230 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24240 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  n may only be ca
24250 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64  lled when a read
24260 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
24270 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  open on.** the p
24280 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73  ager. It returns
24290 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
242a0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
242b0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
242c0 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
242d0 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
242e0 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
242f0 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
24300 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
24310 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
24320 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f   1 page file..*/
24330 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
24340 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
24350 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
24360 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  pnPage){.  asser
24370 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
24380 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
24390 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
243a0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
243b0 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
243c0 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20  ED );.  *pnPage 
243d0 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64  = (int)pPager->d
243e0 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  bSize;.}.../*.**
243f0 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
24400 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
24410 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
24420 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
24430 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
24440 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
24450 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
24460 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
24470 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
24480 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
24490 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
244a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
244b0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
244c0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
244d0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
244e0 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
244f0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
24500 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
24510 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
24520 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
24530 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
24540 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
24550 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
24560 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
24570 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
24580 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
24590 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
245a0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
245b0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
245c0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
245d0 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
245e0 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
245f0 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
24600 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
24610 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
24620 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
24630 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
24640 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
24650 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
24660 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
24670 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
24680 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
24690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
246b0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
246c0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
246d0 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20  his is either a 
246e0 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74  no-op (because t
246f0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
24700 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61  k is .  ** alrea
24710 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20  dy held, or one 
24720 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69  of the transisti
24730 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73  ons that the bus
24740 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d  y-handler.  ** m
24750 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75  ay be invoked du
24760 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20  ring, according 
24770 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  to the comment a
24780 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  bove.  ** sqlite
24790 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
247a0 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  dler()..  */.  a
247b0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
247c0 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29  eLock>=locktype)
247d0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
247e0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
247f0 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
24800 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
24810 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
24820 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
24830 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
24840 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
24850 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20  ).  );..  do {. 
24860 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
24870 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b  kDb(pPager, lock
24880 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
24890 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
248a0 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73   && pPager->xBus
248b0 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
248c0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
248d0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
248e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  ;.}../*.** Funct
248f0 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61  ion assertTrunca
24900 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
24910 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74  ger) checks that
24920 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
24930 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
24940 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20  e for all dirty 
24950 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
24960 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
24970 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68  e:.**.**   a) Th
24980 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
24990 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
249a0 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ual to the size 
249b0 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  of the .**      
249c0 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
249d0 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73   image, in pages
249e0 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  , OR.**.**   b) 
249f0 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  if the page cont
24a00 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e  ent were written
24a10 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69   at this time, i
24a20 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20  t would not.**  
24a30 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79      be necessary
24a40 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
24a50 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75  rrent content ou
24a60 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  t to the sub-jou
24a70 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73  rnal.**      (as
24a80 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66   determined by f
24a90 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75  unction subjRequ
24aa0 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a  iresPage())..**.
24ab0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74  ** If the condit
24ac0 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20  ion asserted by 
24ad0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65  this function we
24ae0 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64  re not true, and
24af0 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
24b00 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69  ge were to be di
24b10 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65  scarded from the
24b20 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70   cache via the p
24b30 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20  agerStress().** 
24b40 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74  routine, pagerSt
24b50 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74  ress() would not
24b60 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
24b70 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
24b80 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  to.** the databa
24b90 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61  se file. If a sa
24ba0 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74  vepoint transact
24bb0 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20  ion were rolled 
24bc0 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68  back after.** th
24bd0 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65  is happened, the
24be0 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
24bf0 75 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72  ur would be to r
24c00 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
24c10 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  nt.** content of
24c20 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76   the page. Howev
24c30 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63  er, since this c
24c40 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72  ontent is not pr
24c50 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a  esent in either.
24c60 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
24c70 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74  file or the port
24c80 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ion of the rollb
24c90 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
24ca0 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
24cb0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
24cc0 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f  content could no
24cd0 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e  t be restored an
24ce0 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
24cf0 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65  e image would be
24d00 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74  come corrupt. It
24d10 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f   is therefore fo
24d20 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a  rtunate that .**
24d30 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e   this circumstan
24d40 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e  ce cannot arise.
24d50 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
24d60 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74  SQLITE_DEBUG).st
24d70 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
24d80 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
24d90 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29  ntCb(PgHdr *pPg)
24da0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
24db0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
24dc0 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TY );.  assert( 
24dd0 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
24de0 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  e(pPg) || pPg->p
24df0 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72  gno<=pPg->pPager
24e00 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74  ->dbSize );.}.st
24e10 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
24e20 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
24e30 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
24e40 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
24e50 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
24e60 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
24e70 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
24e80 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23  nstraintCb);.}.#
24e90 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73  else.# define as
24ea0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
24eb0 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23  traint(pPager).#
24ec0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  endif../*.** Tru
24ed0 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ncate the in-mem
24ee0 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ory database fil
24ef0 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65  e image to nPage
24f00 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a   pages. This .**
24f10 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
24f20 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
24f30 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  fy the database 
24f40 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74  file on disk. It
24f50 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74   .** just sets t
24f60 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
24f70 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  e of the pager o
24f80 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68  bject so that th
24f90 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e  e .** truncation
24fa0 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68   will be done wh
24fb0 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  en the current t
24fc0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
24fd0 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  mmitted..*/.void
24fe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
24ff0 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72  ncateImage(Pager
25000 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
25010 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
25020 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
25030 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  =nPage );.  asse
25040 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
25050 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
25060 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70  _CACHEMOD );.  p
25070 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
25080 6e 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54  nPage;.  assertT
25090 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
250a0 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f  t(pPager);.}.../
250b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
250c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
250d0 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
250e0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
250f0 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e  lback. It.** syn
25100 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  cs the journal f
25110 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65  ile to disk, the
25120 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a  n sets pPager->j
25130 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65  ournalHdr to the
25140 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
25150 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20  journal file so 
25160 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70  that the pager_p
25170 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
25180 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20  e knows.** that 
25190 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
251a0 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  al file has been
251b0 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53   synced..**.** S
251c0 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  yncing a hot-jou
251d0 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66  rnal to disk bef
251e0 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ore attempting t
251f0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65  o roll it back e
25200 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20  nsures .** that 
25210 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75  if a power-failu
25220 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  re occurs during
25230 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74   the rollback, t
25240 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a  he process that.
25250 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c  ** attempts roll
25260 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73  back following s
25270 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73  ystem recovery s
25280 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75  ees the same jou
25290 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rnal.** content 
252a0 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  as this process.
252b0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
252c0 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61  hing goes as pla
252d0 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  nned, SQLITE_OK 
252e0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
252f0 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53  erwise, .** an S
25300 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
25310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25320 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
25330 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
25340 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
25350 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
25360 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
25370 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
25380 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
25390 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59  ->jfd, SQLITE_SY
253a0 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a  NC_NORMAL);.  }.
253b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
253c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
253d0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
253e0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
253f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
25400 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  dr);.  }.  retur
25410 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
25420 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
25430 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
25440 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
25450 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
25460 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
25470 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
25480 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
25490 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
254a0 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
254b0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
254c0 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
254d0 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
254e0 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
254f0 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
25500 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
25510 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
25520 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
25530 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
25540 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
25550 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
25560 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
25570 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
25580 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
25590 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
255a0 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
255b0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
255c0 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
255d0 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
255e0 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
255f0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
25600 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
25610 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
25620 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
25630 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
25640 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
25650 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
25660 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
25670 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
25680 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
25690 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38  r *pPager){.  u8
256a0 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70   *pTmp = (u8 *)p
256b0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
256c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  ;..  assert( ass
256d0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
256e0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73  pPager) );.  dis
256f0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
25700 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
25710 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
25720 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a 20 70  Malloc();.  /* p
25730 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
25740 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
25750 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
25760 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
25770 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71  TE_OMIT_WAL.  sq
25780 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
25790 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67  ager->pWal, pPag
257a0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
257b0 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  s, pPager->pageS
257c0 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50  ize, pTmp);.  pP
257d0 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
257e0 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
257f0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
25800 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
25810 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
25820 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
25830 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
25840 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a  open, sync the j
25850 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
25860 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63  re calling Unloc
25870 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20  kAndRollback..  
25880 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
25890 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61  not done, then a
258a0 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  n unsynced porti
258b0 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  on of the open j
258c0 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66  ournal .    ** f
258d0 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65  ile may be playe
258e0 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
258f0 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70  database. If a p
25900 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
25910 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c  urs .    ** whil
25920 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  e this is happen
25930 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
25940 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e could become c
25950 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20  orrupt..    **. 
25960 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f     ** If an erro
25970 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
25980 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68  rying to sync th
25990 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74  e journal, shift
259a0 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
259b0 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52  * into the ERROR
259c0 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75   state. This cau
259d0 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ses UnlockAndRol
259e0 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20  lback to unlock 
259f0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
25a00 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ase and close th
25a10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
25a20 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e  ithout attemptin
25a30 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20  g to roll it.   
25a40 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61   ** back or fina
25a50 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78  lize it. The nex
25a60 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20  t database user 
25a70 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20  will have to do 
25a80 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot-journal.    
25a90 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f  ** rollback befo
25aa0 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
25ab0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
25ac0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
25ad0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
25ae0 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  d) ){.      page
25af0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
25b00 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
25b10 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20  nal(pPager));.  
25b20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c    }.    pagerUnl
25b30 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
25b40 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
25b50 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
25b60 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65  lloc();.  enable
25b70 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
25b80 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
25b90 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
25ba0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
25bb0 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  er)));.  IOTRACE
25bc0 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
25bd0 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74  pPager)).  sqlit
25be0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
25bf0 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  ->jfd);.  sqlite
25c00 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
25c10 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  >fd);.  sqlite3P
25c20 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20  ageFree(pTmp);. 
25c30 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
25c40 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ose(pPager->pPCa
25c50 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  che);..#ifdef SQ
25c60 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
25c70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
25c80 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72  decFree ) pPager
25c90 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61  ->xCodecFree(pPa
25ca0 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65  ger->pCodec);.#e
25cb0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
25cc0 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  !pPager->aSavepo
25cd0 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  int && !pPager->
25ce0 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  pInJournal );.  
25cf0 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
25d00 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
25d10 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
25d20 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69  sjfd) );..  sqli
25d30 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
25d40 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
25d50 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  E_OK;.}..#if !de
25d60 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
25d70 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
25d80 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
25d90 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
25da0 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  er for page pPg.
25db0 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
25dc0 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
25dd0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
25de0 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f  return pPg->pgno
25df0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
25e00 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
25e10 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
25e20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
25e30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
25e40 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
25e50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  g){.  sqlite3Pca
25e60 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a  cheRef(pPg);.}..
25e70 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
25e80 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72  ournal. In other
25e90 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
25ea0 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
25eb0 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
25ec0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
25ed0 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
25ee0 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
25ef0 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
25f00 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61  e.** disk and ca
25f10 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e  n be restored in
25f20 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
25f30 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
25f40 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
25f50 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  he Pager.noSync 
25f60 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
25f70 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
25f80 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f  is a no-op..** O
25f90 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63  therwise, the ac
25fa0 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64  tions required d
25fb0 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75  epend on the jou
25fc0 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68  rnal-mode and th
25fd0 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61  e .** device cha
25fe0 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20  racteristics of 
25ff0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
26000 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
26010 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f  **   * If the jo
26020 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e  urnal file is an
26030 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
26040 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69  al file, no acti
26050 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62  on need.**     b
26060 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20  e taken..**.**  
26070 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66   * Otherwise, if
26080 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
26090 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
260a0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
260b0 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68  perty,.**     th
260c0 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
260d0 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
260e0 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a  cently written j
260f0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
26100 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20       is updated 
26110 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
26120 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  umber of journal
26130 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61   records that ha
26140 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77  ve.**     been w
26150 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67  ritten following
26160 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65   it. If the page
26170 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69  r is operating i
26180 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20  n full-sync.**  
26190 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68     mode, then th
261a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
261b0 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20  s synced before 
261c0 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70  this field is up
261d0 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  dated..**.**   *
261e0 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64   If the device d
261f0 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
26200 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70  the SEQUENTIAL p
26210 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a  roperty, then .*
26220 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69  *     journal fi
26230 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  le is synced..**
26240 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64  .** Or, in pseud
26250 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  o-code:.**.**   
26260 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f  if( NOT <in-memo
26270 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a  ry journal> ){.*
26280 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41  *     if( NOT SA
26290 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20  FE_APPEND ){.** 
262a0 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d        if( <full-
262b0 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79  sync mode> ) xSy
262c0 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
262d0 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70  >);.**       <up
262e0 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e  date nRec field>
262f0 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20  .**     } .**   
26300 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e    if( NOT SEQUEN
26310 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f  TIAL ) xSync(<jo
26320 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
26330 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75     }.**.** If su
26340 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72  ccessful, this r
26350 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
26360 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
26370 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20  C flag of every 
26380 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74  .** page current
26390 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  ly held in memor
263a0 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  y before returni
263b0 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ng SQLITE_OK. If
263c0 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
263d0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
263e0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
263f0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
26400 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
26410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26420 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
26430 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
26440 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63  ewHdr){.  int rc
26450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
26470 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
26480 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
26490 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
264a0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
264b0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
264c0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
264d0 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
264e0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
264f0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
26500 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
26510 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
26520 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  ager) );..  rc =
26530 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
26540 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65  lusiveLock(pPage
26550 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
26560 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
26570 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
26580 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
26590 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
265a0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
265b0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
265c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
265d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
265e0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
265f0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
26600 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
26610 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
26620 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
26630 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
26640 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26650 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
26660 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
26670 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
26680 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
26690 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
266a0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
266b0 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
266c0 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
266d0 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
266e0 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
266f0 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
26700 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
26710 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
26720 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
26730 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
26740 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
26750 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
26760 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
26770 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
26780 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
26790 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
267a0 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
267b0 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
267c0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
267d0 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
267e0 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
267f0 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
26800 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
26810 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
26820 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
26830 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
26840 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
26850 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
26860 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
26870 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
26880 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
26890 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
268a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
268b0 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
268c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
268d0 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
268e0 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
268f0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
26900 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
26910 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
26920 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
26930 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
26940 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
26950 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
26960 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
26970 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
26980 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
26990 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
269a0 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
269b0 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
269c0 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
269d0 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
269e0 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
269f0 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
26a00 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
26a10 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
26a20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
26a30 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
26a40 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
26a50 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
26a60 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
26a70 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
26a80 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
26a90 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
26aa0 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
26ab0 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
26ac0 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
26ad0 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
26ae0 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
26af0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
26b00 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
26b10 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
26b20 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
26b30 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
26b40 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
26b50 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
26b60 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
26b70 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
26b80 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
26b90 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
26ba0 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
26bb0 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
26bc0 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
26bd0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
26be0 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
26bf0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
26c00 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
26c10 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
26c20 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
26c30 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
26c40 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
26c50 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
26c60 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
26c70 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
26c80 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
26c90 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
26ca0 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
26cb0 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
26cc0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
26cd0 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
26ce0 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
26cf0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
26d00 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
26d10 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
26d20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26d30 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
26d40 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
26d50 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
26d60 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
26d70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
26d80 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
26d90 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
26da0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
26db0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
26dc0 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
26dd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26de0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
26df0 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
26e00 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
26e10 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
26e20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26e30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
26e40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
26e50 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
26e60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
26e70 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
26e80 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
26e90 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
26ea0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26eb0 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
26ec0 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
26ed0 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
26ee0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
26ef0 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
26f00 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
26f10 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
26f20 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
26f30 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
26f40 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
26f50 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
26f60 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
26f70 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
26f80 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
26f90 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
26fa0 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
26fb0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
26fc0 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
26fd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
26fe0 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
26ff0 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
27000 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
27010 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
27020 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
27030 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
27040 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
27050 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
27060 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
27070 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
27080 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
27090 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
270a0 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
270b0 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
270c0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
270d0 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
270e0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
270f0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
27100 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
27110 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
27120 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
27130 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
27140 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
27150 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
27160 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
27170 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
27180 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
27190 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
271a0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
271b0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
271c0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
271d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
271e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
271f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
27200 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
27210 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
27220 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
27230 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
27240 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
27250 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
27260 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
27270 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
27280 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
27290 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
272a0 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b  alHdr.        );
272b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
272c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
272d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
272e0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
272f0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
27300 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
27310 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
27320 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
27330 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
27340 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
27350 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
27360 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
27370 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
27380 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
27390 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
273a0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20  ger->syncFlags| 
273b0 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
273c0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53  er->syncFlags==S
273d0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f  QLITE_SYNC_FULL?
273e0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
273f0 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20  ONLY:0).        
27400 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27410 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
27420 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
27430 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  }..      pPager-
27440 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
27450 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
27460 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48  ;.      if( newH
27470 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  dr && 0==(iDc&SQ
27480 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
27490 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
274a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
274b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
274c0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
274d0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
274e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
274f0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
27500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
27510 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
27520 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
27530 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
27540 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
27550 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   /* Unless the p
27560 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e  ager is in noSyn
27570 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
27580 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
27590 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  t .  ** successf
275a0 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74  ully synced. Eit
275b0 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74  her way, clear t
275c0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
275d0 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a  NC flag on .  **
275e0 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f   all pages..  */
275f0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
27600 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
27610 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
27620 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
27630 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
27640 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74  _DBMOD;.  assert
27650 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
27660 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
27670 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27680 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
27690 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
276a0 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
276b0 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
276c0 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
276d0 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
276e0 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
276f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
27700 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
27710 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
27720 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
27730 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
27740 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
27750 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
27760 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
27770 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
27780 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
27790 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
277a0 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
277b0 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
277c0 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
277d0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
277e0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
277f0 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
27800 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
27810 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
27820 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
27830 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
27840 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
27850 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
27860 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
27870 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
27880 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
27890 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
278a0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
278b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
278c0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
278d0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
278e0 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
278f0 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
27900 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
27910 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
27920 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
27930 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
27940 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
27950 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
27960 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
27970 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
27980 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
27990 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
279a0 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
279b0 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
279c0 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
279d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
279e0 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
279f0 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
27a00 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
27a10 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
27a20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
27a30 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
27a40 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
27a50 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
27a60 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
27a70 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
27a80 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
27a90 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
27aa0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
27ab0 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
27ac0 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
27ad0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
27ae0 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
27af0 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
27b00 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
27b10 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
27b20 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
27b30 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
27b40 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
27b50 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
27b60 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
27b70 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
27b80 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
27b90 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
27ba0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
27bb0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
27bc0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
27bd0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
27be0 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
27bf0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
27c00 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
27c10 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
27c20 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
27c30 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
27c40 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
27c50 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
27c60 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
27c70 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65  te_pagelist(Page
27c80 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
27c90 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
27ca0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cc0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
27cd0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
27ce0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
27cf0 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61  alled for rollba
27d00 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49  ck pagers in WRI
27d10 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e  TER_DBMOD state.
27d20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
27d30 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
27d40 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
27d50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
27d60 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
27d70 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OD );.  assert( 
27d80 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
27d90 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
27da0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
27db0 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  le is a temp-fil
27dc0 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
27dd0 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
27de0 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20  it now. It.  ** 
27df0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
27e00 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68  for rc to be oth
27e10 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
27e20 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68  K if this branch
27e30 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20  .  ** is taken, 
27e40 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  as pager_wait_on
27e50 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  _lock() is a no-
27e60 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65  op for temp-file
27e70 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
27e80 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
27e90 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
27ea0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
27eb0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
27ec0 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
27ed0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
27ee0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ger, pPager->fd,
27ef0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
27f00 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  s);.  }..  /* Be
27f10 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
27f20 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56  rite, give the V
27f30 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61  FS a hint of wha
27f40 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a  t the final.  **
27f50 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20   file size will 
27f60 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  be..  */.  asser
27f70 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
27f80 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
27f90 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20  r->fd) );.  if( 
27fa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27fb0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
27fc0 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
27fd0 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ze ){.    sqlite
27fe0 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d  3_int64 szFile =
27ff0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
28000 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
28010 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  64)pPager->dbSiz
28020 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e;.    sqlite3Os
28030 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
28040 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
28050 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
28060 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20  NT, &szFile);.  
28070 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
28080 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
28090 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68  bSize;.  }..  wh
280a0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
280b0 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
280c0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
280d0 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20  List->pgno;..   
280e0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
280f0 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
28100 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
28110 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
28120 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
28130 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
28140 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
28150 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
28160 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61  teImage() was ca
28170 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
28180 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
28190 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
281a0 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
281b0 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
281c0 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
281d0 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
281e0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
281f0 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f    ** Also, do no
28200 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20  t write out any 
28210 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68  page that has th
28220 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
28230 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73  TE flag.    ** s
28240 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74  et (set by sqlit
28250 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
28260 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ())..    */.    
28270 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
28280 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
28290 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
282a0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
282b0 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
282c0 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
282d0 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
282e0 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74  ize;   /* Offset
282f0 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   to write */.   
28300 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20     char *pData; 
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28330 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69    /* Data to wri
28340 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20  te */    ..     
28350 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d   assert( (pList-
28360 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
28370 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
28380 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
28390 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77  gno==1 ) pager_w
283a0 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
283b0 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20  er(pList);..    
283c0 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
283d0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
283e0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
283f0 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
28400 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
28410 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
28420 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ta);..      /* W
28430 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67  rite out the pag
28440 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20  e data. */.     
28450 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
28460 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
28470 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
28480 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
28490 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
284a0 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20  page 1 was just 
284b0 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
284c0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
284d0 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20   to match.      
284e0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77  ** the value now
284f0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
28500 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
28510 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20   writing this . 
28520 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75       ** page cau
28530 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  sed the database
28540 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75   file to grow, u
28550 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65  pdate dbFileSize
28560 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
28570 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
28580 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
28590 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
285a0 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
285b0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
285c0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
285d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
285e0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
285f0 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
28600 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
28610 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
28620 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
28630 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
28640 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a  STAT_WRITE]++;..
28650 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
28660 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63  any backup objec
28670 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63  ts copying the c
28680 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
28690 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  pager. */.      
286a0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
286b0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
286c0 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
286d0 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a  pList->pData);..
286e0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
286f0 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  (("STORE %d page
28700 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
28710 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
28720 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
28730 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
28740 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
28750 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  t)));.      IOTR
28760 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
28770 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
28780 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
28790 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
287a0 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
287b0 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nt);.    }else{.
287c0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
287d0 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  (("NOSTORE %d pa
287e0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
287f0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29  D(pPager), pgno)
28800 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
28810 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
28820 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73  pList);.    pLis
28830 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
28840 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  y;.  }..  return
28850 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e   rc;.}../*.** En
28860 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 75  sure that the su
28870 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  b-journal file i
28880 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73  s open. If it is
28890 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
288a0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
288b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
288c0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
288d0 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72  returned if ever
288e0 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f  ything goes acco
288f0 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41  rding to plan. A
28900 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  n .** SQLITE_IOE
28910 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
28920 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
28930 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
28940 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66  e3OsOpen() .** f
28950 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
28960 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  int openSubJourn
28970 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
28980 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
28990 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
289a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
289b0 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20  jfd) ){.    if( 
289c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
289d0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
289e0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c  ALMODE_MEMORY ||
289f0 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
28a00 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73  emory ){.      s
28a10 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
28a20 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
28a30 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
28a40 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f       rc = pagerO
28a50 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
28a60 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51  pPager->sjfd, SQ
28a70 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
28a80 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  RNAL);.    }.  }
28a90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28aa0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
28ab0 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75  record of the cu
28ac0 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70  rrent state of p
28ad0 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73  age pPg to the s
28ae0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20  ub-journal. .** 
28af0 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72  It is the caller
28b00 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  s responsibility
28b10 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75   to use subjRequ
28b20 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63 68  iresPage() to ch
28b30 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20  eck .** that it 
28b40 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  is really requir
28b50 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
28b60 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
28b70 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
28b80 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69  sful, set the bi
28b90 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
28ba0 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  to pPg->pgno in 
28bb0 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66  the bitvecs.** f
28bc0 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  or all open save
28bd0 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65  points before re
28be0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  turning..**.** T
28bf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
28c00 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urns SQLITE_OK i
28c10 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
28c20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49  successful, an I
28c30 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  O.** error code 
28c40 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
28c50 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73  o write to the s
28c60 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  ub-journal fails
28c70 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  , or .** SQLITE_
28c80 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f  NOMEM if a mallo
28c90 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65  c fails while se
28ca0 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61  tting a bit in a
28cb0 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69   savepoint.** bi
28cc0 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tvec..*/.static 
28cd0 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  int subjournalPa
28ce0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
28cf0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28d00 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
28d10 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
28d20 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ger;.  if( pPage
28d30 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
28d40 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
28d50 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a  E_OFF ){..    /*
28d60 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   Open the sub-jo
28d70 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73  urnal, if it has
28d80 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
28d90 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20  n opened */.    
28da0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28db0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
28dc0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
28dd0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
28de0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
28df0 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ger) );.    asse
28e00 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
28e10 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67  r->sjfd) || pPag
28e20 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29  er->nSubRec==0 )
28e30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
28e40 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
28e50 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
28e60 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
28e70 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
28e80 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
28e90 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20  >dbOrigSize .   
28ea0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   );.    rc = ope
28eb0 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67  nSubJournal(pPag
28ec0 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er);..    /* If 
28ed0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
28ee0 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65  was opened succe
28ef0 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20  ssfully (or was 
28f00 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20  already open),. 
28f10 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20     ** write the 
28f20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69  journal record i
28f30 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a  nto the file.  *
28f40 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
28f50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28f60 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
28f70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20  Pg->pData;.     
28f80 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69   i64 offset = (i
28f90 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  64)pPager->nSubR
28fa0 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
28fb0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63  geSize);.      c
28fc0 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a  har *pData2;.  .
28fd0 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
28fe0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
28ff0 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
29000 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
29010 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50 41  Data2);.      PA
29020 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d  GERTRACE(("STMT-
29030 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
29040 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
29050 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
29060 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
29070 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
29080 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74  er->sjfd, offset
29090 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
290a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
290b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
290c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
290d0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  rite(pPager->sjf
290e0 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
290f0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
29100 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a  set+4);.      }.
29110 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
29120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29130 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  .    pPager->nSu
29140 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  bRec++;.    asse
29150 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
29160 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
29170 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
29180 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
29190 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
291a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
291b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
291c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
291d0 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c   by the pcache l
291e0 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73  ayer when it has
291f0 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a   reached some.**
29200 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d   soft memory lim
29210 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  it. The first ar
29220 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
29230 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f  ter to a Pager o
29240 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61  bject.** (cast a
29250 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20  s a void*). The 
29260 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20  pager is always 
29270 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74  'purgeable' (not
29280 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
29290 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20   database). The 
292a0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
292b0 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
292c0 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73  o a page that is
292d0 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64   .** currently d
292e0 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20  irty but has no 
292f0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
29300 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65  rences. The page
29310 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73  .** is always as
29320 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
29330 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e Pager object p
29340 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
29350 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  st .** argument.
29360 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f  .**.** The job o
29370 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
29380 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63  is to make pPg c
29390 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20  lean by writing 
293a0 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
293b0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
293c0 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73  ase file, if pos
293d0 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20  sible. This may 
293e0 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20  involve syncing 
293f0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
29400 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ile. .**.** If s
29410 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74  uccessful, sqlit
29420 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
29430 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  n() is called on
29440 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a   the page and.**
29450 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
29460 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
29470 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
29480 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20   trying to make 
29490 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61  the.** page clea
294a0 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  n, the IO error 
294b0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
294c0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61  . If the page ca
294d0 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20  nnot be.** made 
294e0 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f  clean for some o
294f0 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74  ther reason, but
29500 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
29510 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
29520 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
29530 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  by sqlite3Pcache
29540 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e  MakeClean() is n
29550 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  ot called..*/.st
29560 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
29570 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67  ress(void *p, Pg
29580 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
29590 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
295a0 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72  ger *)p;.  int r
295b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
295c0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
295d0 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
295e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
295f0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
29600 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  Y );..  /* The d
29610 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c  oNotSyncSpill fl
29620 61 67 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  ag is set during
29630 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e   times when doin
29640 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a  g a sync of.  **
29650 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64   journal (and ad
29660 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65  ding a new heade
29670 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  r) is not allowe
29680 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a  d.  This occurs.
29690 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c    ** during call
296a0 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
296b0 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74  rWrite() while t
296c0 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c  rying to journal
296d0 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70   multiple.  ** p
296e0 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74  ages belonging t
296f0 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  o the same secto
29700 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
29710 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67   doNotSpill flag
29720 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61   inhibits all ca
29730 63 68 65 20 73 70 69 6c 6c 69 6e 67 20 72 65 67  che spilling reg
29740 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
29750 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 61  er.  ** or not a
29760 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
29770 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74 20  d.  This is set 
29780 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
29790 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69  k..  **.  ** Spi
297a0 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72  lling is also pr
297b0 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e  ohibited when in
297c0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
297d0 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64  since that could
297e0 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61  .  ** lead to da
297f0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
29800 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72 72  n.   In the curr
29810 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 6f  ent implementato
29820 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d  n it .  ** is im
29830 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c  possible for sql
29840 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
29850 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77  ) to be called w
29860 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d  ith createFlag==
29870 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20  1.  ** while in 
29880 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
29890 20 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70   hence it is imp
298a0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73  ossible for this
298b0 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a   routine to.  **
298c0 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68   be called in th
298d0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20  e error state.  
298e0 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65  Nevertheless, we
298f0 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52   include a NEVER
29900 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72  ().  ** test for
29910 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
29920 20 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20   as a safeguard 
29930 61 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63  against future c
29940 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  hanges..  */.  i
29950 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
29960 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
29970 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
29980 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
29990 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72 6e 20  tSpill ) return 
299a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
299b0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
299c0 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50 67 2d  ncSpill && (pPg-
299d0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
299e0 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 7b 0a  EED_SYNC)!=0 ){.
299f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29a00 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67  E_OK;.  }..  pPg
29a10 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
29a20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
29a30 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f  pPager) ){.    /
29a40 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65  * Write a single
29a50 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20   frame for this 
29a60 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e  page to the log.
29a70 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
29a80 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
29a90 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20 3d  ) ){ .      rc =
29aa0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
29ab0 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20  pPg); .    }.   
29ac0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29ad0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
29ae0 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
29af0 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20  pPager, pPg, 0, 
29b00 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
29b10 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e  e{.  .    /* Syn
29b20 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
29b30 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  le if required. 
29b40 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  */.    if( pPg->
29b50 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
29b60 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70  _SYNC .     || p
29b70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
29b80 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
29b90 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20  EMOD.    ){.    
29ba0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
29bb0 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  al(pPager, 1);. 
29bc0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
29bd0 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
29be0 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69  r of this page i
29bf0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
29c00 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
29c10 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  f.    ** the dat
29c20 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20  abase image, it 
29c30 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77  may need to be w
29c40 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75  ritten to the su
29c50 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  b-journal..    *
29c60 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  * This is becaus
29c70 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61  e the call to pa
29c80 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
29c90 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20  st() below will 
29ca0 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75 61  not.    ** actua
29cb0 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20 74  lly write data t
29cc0 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68  o the file in th
29cd0 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a  is case..    **.
29ce0 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20      ** Consider 
29cf0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
29d00 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73  quence of events
29d10 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
29d20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20    BEGIN;.    ** 
29d30 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67      <journal pag
29d40 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X>.    **     
29d50 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a  <modify page X>.
29d60 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50      **     SAVEP
29d70 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20  OINT sp;.    ** 
29d80 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61        <shrink da
29d90 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59  tabase file to Y
29da0 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20   pages>.    **  
29db0 20 20 20 20 20 70 61 67 65 72 53 74 72 65 73 73       pagerStress
29dc0 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a 20  (page X).    ** 
29dd0 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
29de0 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sp;.    **.    *
29df0 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e  * If (X>Y), then
29e00 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73   when pagerStres
29e10 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65  s is called page
29e20 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77   X will not be w
29e30 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75  ritten.    ** ou
29e40 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
29e50 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c  e file, but will
29e60 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   be dropped from
29e70 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e   the cache. Then
29e80 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  ,.    ** followi
29e90 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  ng the "ROLLBACK
29ea0 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e   TO sp" statemen
29eb0 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  t, reading page 
29ec0 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20 20  X will read.    
29ed0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
29ee0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
29ef0 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  This will be the
29f00 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20   copy of page X 
29f10 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61 73  as it.    ** was
29f20 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
29f30 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e  ction started, n
29f40 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ot as it was whe
29f50 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22  n "SAVEPOINT sp"
29f60 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65 63  .    ** was exec
29f70 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uted..    **.   
29f80 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
29f90 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68 65   is to write the
29fa0 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f   current data fo
29fb0 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68  r page X into th
29fc0 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f  e .    ** sub-jo
29fd0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28  urnal file now (
29fe0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
29ff0 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20  eady there), so 
2a000 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 20  that it will.   
2a010 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20   ** be restored 
2a020 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  to its current v
2a030 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52  alue when the "R
2a040 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69  OLLBACK TO sp" i
2a050 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75 74  s .    ** execut
2a060 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
2a070 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20  f( NEVER(.      
2a080 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
2a090 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  && pPg->pgno>pPa
2a0a0 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73  ger->dbSize && s
2a0b0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
2a0c0 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20 20  pPg).    ) ){.  
2a0d0 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
2a0e0 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
2a0f0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72    }.  .    /* Wr
2a100 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
2a110 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74   of the page out
2a120 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2a130 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
2a140 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a150 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2a160 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
2a170 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30  DR_NEED_SYNC)==0
2a180 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
2a190 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
2a1a0 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29  ist(pPager, pPg)
2a1b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2a1c0 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
2a1d0 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69  as clean. */.  i
2a1e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a1f0 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
2a200 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
2a210 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2a220 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2a230 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
2a240 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2a250 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ean(pPg);.  }.. 
2a260 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
2a270 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
2a280 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   .}.../*.** Allo
2a290 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
2a2a0 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20  ize a new Pager 
2a2b0 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61  object and put a
2a2c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a   pointer to it.*
2a2d0 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54  * in *ppPager. T
2a2e0 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
2a2f0 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72  eventually be fr
2a300 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69  eed by passing i
2a310 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  t.** to sqlite3P
2a320 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a  agerClose()..**.
2a330 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65  ** The zFilename
2a340 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2a350 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74   path to the dat
2a360 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2a370 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  en..** If zFilen
2a380 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
2a390 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
2a3a0 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
2a3b0 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
2a3c0 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
2a3d0 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
2a3e0 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  . Temporary file
2a3f0 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64  s are be deleted
2a400 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
2a410 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  y when they are 
2a420 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65  closed. If zFile
2a430 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
2a440 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20  :" then .** all 
2a450 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
2a460 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74  eld in cache. It
2a470 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
2a480 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54  n to disk. .** T
2a490 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
2a4a0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  to implement an 
2a4b0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
2a4c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  se..**.** The nE
2a4d0 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73  xtra parameter s
2a4e0 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d  pecifies the num
2a4f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2a500 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a  space allocated.
2a510 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61  ** along with ea
2a520 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ch page referenc
2a530 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73  e. This space is
2a540 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
2a550 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68  e user.** via th
2a560 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
2a570 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a  tExtra() API..**
2a580 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72  .** The flags ar
2a590 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74  gument is used t
2a5a0 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72  o specify proper
2a5b0 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74  ties that affect
2a5c0 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f   the.** operatio
2a5d0 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20  n of the pager. 
2a5e0 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  It should be pas
2a5f0 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65  sed some bitwise
2a600 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20   combination.** 
2a610 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a 20 66  of the PAGER_* f
2a620 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
2a630 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
2a640 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
2a650 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
2a660 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
2a670 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
2a680 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
2a690 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
2a6a0 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
2a6b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
2a6c0 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
2a6d0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
2a6e0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
2a6f0 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
2a700 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
2a710 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
2a720 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
2a730 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
2a740 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
2a750 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
2a760 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
2a770 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
2a780 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
2a790 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
2a7a0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
2a7b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2a7c0 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
2a7d0 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
2a7e0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
2a7f0 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
2a800 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
2a810 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
2a820 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
2a830 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
2a840 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2a850 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
2a860 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
2a870 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
2a880 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
2a890 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
2a8a0 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
2a8b0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
2a8c0 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
2a8d0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2a8e0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2a8f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2a900 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
2a910 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
2a920 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
2a930 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
2a940 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
2a950 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
2a960 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a970 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
2a980 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
2a990 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
2a9a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2a9b0 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
2a9c0 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
2a9d0 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
2a9e0 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
2a9f0 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e  (DbPage*) /* Fun
2aa00 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69  ction to reiniti
2aa10 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29  alize pages */.)
2aa20 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
2aa30 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2aa40 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
2aa50 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
2aa60 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
2aa70 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2aa80 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
2aa90 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2aaa0 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
2aab0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
2aac0 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
2aad0 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
2aae0 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
2aaf0 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
2ab00 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2ab10 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
2ab20 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
2ab30 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
2ab40 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
2ab50 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
2ab60 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
2ab70 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
2ab80 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
2ab90 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
2aba0 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
2abb0 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
2abc0 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
2abd0 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
2abe0 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
2abf0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
2ac00 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
2ac10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2ac20 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
2ac30 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
2ac40 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
2ac50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
2ac60 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
2ac70 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
2ac80 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53  */.  int pcacheS
2ac90 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ize = sqlite3Pca
2aca0 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20  cheSize();      
2acb0 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2acc0 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65  ocate for PCache
2acd0 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65   */.  u32 szPage
2ace0 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  Dflt = SQLITE_DE
2acf0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2ad00 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67    /* Default pag
2ad10 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73  e size */.  cons
2ad20 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30  t char *zUri = 0
2ad30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73  ;    /* URI args
2ad40 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e   to copy */.  in
2ad50 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20  t nUri = 0;     
2ad60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ad70 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52 49   of bytes of URI
2ad80 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a   args at *zUri *
2ad90 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
2ada0 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
2adb0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
2adc0 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
2add0 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20  ile-handle.  ** 
2ade0 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f  (there are two o
2adf0 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e  f them, the main
2ae00 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
2ae10 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54   sub-journal). T
2ae20 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  his.  ** is the 
2ae30 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65  maximum space re
2ae40 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e  quired for an in
2ae50 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
2ae60 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a  file handle .  *
2ae70 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20  * and a regular 
2ae80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
2ae90 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61  dle. Note that a
2aea0 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61   "regular journa
2aeb0 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d  l-handle".  ** m
2aec0 61 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20  ay be a wrapper 
2aed0 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69  capable of cachi
2aee0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72  ng the first por
2aef0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
2af00 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  nal.  ** file in
2af10 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65   memory to imple
2af20 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d  ment the atomic-
2af30 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2af40 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f  on (see .  ** so
2af50 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61  urce file journa
2af60 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  l.c)..  */.  if(
2af70 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53   sqlite3JournalS
2af80 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65  ize(pVfs)>sqlite
2af90 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
2afa0 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  ) ){.    journal
2afb0 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
2afc0 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  8(sqlite3Journal
2afd0 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d  Size(pVfs));.  }
2afe0 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  else{.    journa
2aff0 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
2b000 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  D8(sqlite3MemJou
2b010 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d  rnalSize());.  }
2b020 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f  ..  /* Set the o
2b030 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
2b040 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61  o NULL in case a
2b050 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
2b060 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
2b070 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2b080 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
2b090 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50  .  if( flags & P
2b0a0 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  AGER_MEMORY ){. 
2b0b0 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
2b0c0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2b0d0 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2b0e0 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  ){.      zPathna
2b0f0 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
2b100 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d  rDup(0, zFilenam
2b110 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  e);.      if( zP
2b120 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65  athname==0  ) re
2b130 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2b140 4d 3b 0a 20 20 20 20 20 20 6e 50 61 74 68 6e 61  M;.      nPathna
2b150 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2b160 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
2b170 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  .      zFilename
2b180 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2b190 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d  #endif..  /* Com
2b1a0 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74  pute and store t
2b1b0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
2b1c0 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64   in an allocated
2b1d0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
2b1e0 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68    ** to by zPath
2b1f0 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61  name, length nPa
2b200 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74  thname. Or, if t
2b210 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
2b220 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65  ry file,.  ** le
2b230 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61  ave both nPathna
2b240 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65  me and zPathname
2b250 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a   set to 0..  */.
2b260 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2b270 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2b280 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
2b290 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e  r *z;.    nPathn
2b2a0 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
2b2b0 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50  thname+1;.    zP
2b2c0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2b2d0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20  3DbMallocRaw(0, 
2b2e0 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20  nPathname*2);.  
2b2f0 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
2b300 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
2b310 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2b320 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68  .    }.    zPath
2b330 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20  name[0] = 0; /* 
2b340 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61  Make sure initia
2b350 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75  lized even if Fu
2b360 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69  llPathname() fai
2b370 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  ls */.    rc = s
2b380 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
2b390 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
2b3a0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
2b3b0 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2b3c0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2b3d0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2b3e0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d  thname);.    z =
2b3f0 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61   zUri = &zFilena
2b400 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  me[sqlite3Strlen
2b410 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d  30(zFilename)+1]
2b420 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20  ;.    while( *z 
2b430 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71  ){.      z += sq
2b440 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
2b450 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73  +1;.      z += s
2b460 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2b470 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  )+1;.    }.    n
2b480 55 72 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31  Uri = (int)(&z[1
2b490 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61  ] - zUri);.    a
2b4a0 73 73 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29  ssert( nUri>=0 )
2b4b0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2b4c0 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68  LITE_OK && nPath
2b4d0 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50  name+8>pVfs->mxP
2b4e0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
2b4f0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
2b500 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  is taken when th
2b510 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72  e journal path r
2b520 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
2b530 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2b540 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69   being opened wi
2b550 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  ll be more than 
2b560 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2b570 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
2b580 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20  in length. This 
2b590 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
2b5a0 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  se cannot be ope
2b5b0 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73  ned,.      ** as
2b5c0 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
2b5d0 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e  possible to open
2b5e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2b5f0 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20  e or even.      
2b600 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  ** check for a h
2b610 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot-journal befor
2b620 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20  e reading..     
2b630 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
2b640 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2b650 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
2b660 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b670 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2b680 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68  3DbFree(0, zPath
2b690 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
2b6a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2b6b0 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
2b6c0 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
2b6d0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
2b6e0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
2b6f0 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
2b700 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
2b710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b720 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
2b730 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
2b740 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
2b750 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
2b760 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
2b770 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
2b780 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2b790 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
2b7a0 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
2b7b0 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
2b7c0 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2b7d0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
2b7e0 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
2b7f0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2b800 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
2b810 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
2b820 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
2b830 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
2b840 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
2b850 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
2b860 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2b870 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2b880 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
2b890 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2b8a0 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2b8b0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2b8c0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
2b8d0 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2b8e0 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
2b8f0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
2b900 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
2b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2b920 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
2b930 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
2b940 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
2b950 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
2b960 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
2b970 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
2b980 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2b990 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
2b9a0 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
2b9b0 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
2b9c0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
2b9d0 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
2b9e0 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
2b9f0 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
2ba00 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
2ba10 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
2ba20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2ba30 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
2ba40 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
2ba50 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20  me + 1 + nUri + 
2ba60 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
2ba70 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
2ba80 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20  hname + 8 + 2   
2ba90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
2baa0 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
2bab0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2bac0 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d  L.    + nPathnam
2bad0 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20  e + 4 + 2       
2bae0 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a       /* zWal */.
2baf0 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73  #endif.  );.  as
2bb00 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2bb10 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54  _ALIGNMENT(SQLIT
2bb20 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75  E_INT_TO_PTR(jou
2bb30 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29  rnalFileSize)) )
2bb40 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b  ;.  if( !pPtr ){
2bb50 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2bb60 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2bb70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2bb80 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
2bb90 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20   pPager =       
2bba0 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28         (Pager*)(
2bbb0 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  pPtr);.  pPager-
2bbc0 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50  >pPCache =    (P
2bbd0 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20  Cache*)(pPtr += 
2bbe0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
2bbf0 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67  Pager)));.  pPag
2bc00 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69  er->fd =   (sqli
2bc10 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2bc20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65  += ROUND8(pcache
2bc30 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72  Size));.  pPager
2bc40 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  ->sjfd = (sqlite
2bc50 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2bc60 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2bc70 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67  OsFile));.  pPag
2bc80 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69  er->jfd =  (sqli
2bc90 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2bca0 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
2bcb0 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze);.  pPager->z
2bcc0 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63  Filename =    (c
2bcd0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  har*)(pPtr += jo
2bce0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2bcf0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2bd00 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
2bd10 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
2bd20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2bd30 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
2bd40 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
2bd50 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
2bd60 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
2bd70 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
2bd80 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 74      assert( nPat
2bd90 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70  hname>0 );.    p
2bda0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
2bdb0 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72  =   (char*)(pPtr
2bdc0 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20   += nPathname + 
2bdd0 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d  1 + nUri);.    m
2bde0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
2bdf0 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
2be00 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2be10 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 20 6d      if( nUri ) m
2be20 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2be30 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61  Filename[nPathna
2be40 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72  me+1], zUri, nUr
2be50 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i);.    memcpy(p
2be60 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2be70 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2be80 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2be90 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
2bea0 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  rnal[nPathname],
2beb0 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c   "-journal\000",
2bec0 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74   8+2);.    sqlit
2bed0 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50  e3FileSuffix3(pP
2bee0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2bef0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2bf00 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
2bf10 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
2bf20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26  pPager->zWal = &
2bf30 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2bf40 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b  [nPathname+8+1];
2bf50 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2bf60 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e  er->zWal, zPathn
2bf70 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2bf80 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
2bf90 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e  ger->zWal[nPathn
2bfa0 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22  ame], "-wal\000"
2bfb0 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  , 4+1);.    sqli
2bfc0 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
2bfd0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2bfe0 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b  , pPager->zWal);
2bff0 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
2c000 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2c010 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  thname);.  }.  p
2c020 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
2c030 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66  fs;.  pPager->vf
2c040 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67  sFlags = vfsFlag
2c050 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  s;..  /* Open th
2c060 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
2c070 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
2c080 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2c090 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f  0] ){.    int fo
2c0a0 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
2c0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
2c0c0 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  S flags returned
2c0d0 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   by xOpen() */. 
2c0e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2c0f0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
2c100 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2c110 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c  Pager->fd, vfsFl
2c120 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  ags, &fout);.   
2c130 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20   assert( !memDb 
2c140 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  );.    readOnly 
2c150 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  = (fout&SQLITE_O
2c160 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a  PEN_READONLY);..
2c170 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
2c180 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  le was successfu
2c190 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72  lly opened for r
2c1a0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
2c1b0 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20  ,.    ** choose 
2c1c0 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  a default page s
2c1d0 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68  ize in case we h
2c1e0 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68  ave to create th
2c1f0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
2c200 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61  e file. The defa
2c210 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ult page size is
2c220 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a   the maximum of:
2c230 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2c240 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55    + SQLITE_DEFAU
2c250 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20  LT_PAGE_SIZE,.  
2c260 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61    **    + The va
2c270 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
2c280 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
2c290 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20  ize().    **    
2c2a0 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61  + The largest pa
2c2b0 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e  ge size that can
2c2c0 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
2c2d0 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  ically..    */. 
2c2e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c2f0 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c  E_OK && !readOnl
2c300 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65  y ){.      setSe
2c310 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
2c320 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 53  ;.      assert(S
2c330 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2c340 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f  GE_SIZE<=SQLITE_
2c350 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2c360 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66  _SIZE);.      if
2c370 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61  ( szPageDflt<pPa
2c380 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
2c390 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
2c3a0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2c3b0 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  e>SQLITE_MAX_DEF
2c3c0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29  AULT_PAGE_SIZE )
2c3d0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61  {.          szPa
2c3e0 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
2c3f0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2c400 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d  _SIZE;.        }
2c410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2c420 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33  szPageDflt = (u3
2c430 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  2)pPager->sector
2c440 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Size;.        }.
2c450 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
2c460 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2c470 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
2c480 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44  {.        int iD
2c490 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
2c4a0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
2c4b0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
2c4c0 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
2c4d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2c4e0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2c4f0 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
2c500 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2c510 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2c520 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
2c530 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >8));.        as
2c540 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f  sert(SQLITE_MAX_
2c550 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2c560 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20  E<=65536);.     
2c570 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65     for(ii=szPage
2c580 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45  Dflt; ii<=SQLITE
2c590 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2c5a0 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29  E_SIZE; ii=ii*2)
2c5b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2c5c0 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
2c5d0 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
2c5e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2c5f0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69   szPageDflt = ii
2c600 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2c620 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
2c630 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
2c640 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2c650 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
2c660 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20  t is not opened 
2c670 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
2c680 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
2c690 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64   we accept the d
2c6a0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2c6b0 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61   and delay actua
2c6c0 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69  lly.    ** openi
2c6d0 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69  ng the file unti
2c6e0 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  l the first call
2c6f0 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20   to OsWrite().. 
2c700 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2c710 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f  s branch is also
2c720 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d   run for an in-m
2c730 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
2c740 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20  An in-memory.   
2c750 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
2c760 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65  the same as a te
2c770 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20  mp-file that is 
2c780 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75  never written ou
2c790 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b  t to.    ** disk
2c7a0 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d   and uses an in-
2c7b0 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20  memory rollback 
2c7c0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20  journal..    */ 
2c7d0 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
2c7e0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  1;.    pPager->e
2c7f0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
2c800 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72  ADER;.    pPager
2c810 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53  ->eLock = EXCLUS
2c820 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65  IVE_LOCK;.    re
2c830 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61  adOnly = (vfsFla
2c840 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  gs&SQLITE_OPEN_R
2c850 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20  EADONLY);.  }.. 
2c860 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
2c870 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53  g call to PagerS
2c880 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72  etPagesize() ser
2c890 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76  ves to set the v
2c8a0 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61  alue of .  ** Pa
2c8b0 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64  ger.pageSize and
2c8c0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
2c8d0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
2c8e0 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20   buffer..  */.  
2c8f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c900 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2c910 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d   pPager->memDb==
2c920 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
2c930 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
2c940 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73  esize(pPager, &s
2c950 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a  zPageDflt, -1);.
2c960 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
2c970 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
2c980 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
2c990 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e  rror occurred in
2c9a0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62   either of the b
2c9b0 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65  locks above, fre
2c9c0 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
2c9d0 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
2c9e0 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
2c9f0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
2ca00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ca10 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
2ca20 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20 20  >pTmpSpace );.  
2ca30 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
2ca40 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
2ca50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2ca60 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
2ca70 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
2ca80 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2ca90 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a  PCache object. *
2caa0 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74  /.  assert( nExt
2cab0 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45 78  ra<1000 );.  nEx
2cac0 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78  tra = ROUND8(nEx
2cad0 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  tra);.  sqlite3P
2cae0 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65  cacheOpen(szPage
2caf0 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d  Dflt, nExtra, !m
2cb00 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  emDb,.          
2cb10 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
2cb20 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
2cb30 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
2cb40 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2cb50 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  ;..  PAGERTRACE(
2cb60 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
2cb70 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
2cb80 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
2cb90 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  r->zFilename));.
2cba0 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
2cbb0 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
2cbc0 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
2cbd0 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72  name))..  pPager
2cbe0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  ->useJournal = (
2cbf0 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  u8)useJournal;. 
2cc00 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2cc10 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Open = 0; */.  /
2cc20 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  * pPager->stmtIn
2cc30 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Use = 0; */.  /*
2cc40 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
2cc50 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2cc60 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
2cc70 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2cc80 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
2cc90 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2cca0 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
2ccb0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
2ccc0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
2ccd0 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
2cce0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
2ccf0 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23 69  ER_UNLOCK; */.#i
2cd00 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 50  f 0.  assert( pP
2cd10 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28  ager->state == (
2cd20 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52  tempFile ? PAGER
2cd30 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47  _EXCLUSIVE : PAG
2cd40 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 23 65  ER_UNLOCK) );.#e
2cd50 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65 72  ndif.  /* pPager
2cd60 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
2cd70 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
2cd80 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46  File = (u8)tempF
2cd90 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
2cda0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2cdb0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
2cdc0 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
2cdd0 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
2cde0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2cdf0 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
2ce00 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
2ce10 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
2ce20 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
2ce30 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
2ce40 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20  u8)tempFile; .  
2ce50 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2ce60 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
2ce70 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
2ce80 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
2ce90 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
2cea0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
2ceb0 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73  8)readOnly;.  as
2cec0 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c  sert( useJournal
2ced0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
2cee0 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72  File );.  pPager
2cef0 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
2cf00 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69  r->tempFile;.  i
2cf10 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
2cf20 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
2cf30 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2cf40 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2cf50 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  rt( pPager->sync
2cf60 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
2cf70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2cf80 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20  walSyncFlags==0 
2cf90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2cfa0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
2cfb0 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  lags==0 );.  }el
2cfc0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
2cfd0 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20  fullSync = 1;.  
2cfe0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
2cff0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2d000 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
2d010 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
2d020 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2d030 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59  _NORMAL | WAL_SY
2d040 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b  NC_TRANSACTIONS;
2d050 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
2d060 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
2d070 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
2d080 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
2d090 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
2d0a0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
2d0b0 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
2d0c0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2d0d0 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
2d0e0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
2d0f0 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20   (u16)nExtra;.  
2d100 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
2d110 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54  izeLimit = SQLIT
2d120 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41  E_DEFAULT_JOURNA
2d130 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20  L_SIZE_LIMIT;.  
2d140 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2d150 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65  Pager->fd) || te
2d160 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53  mpFile );.  setS
2d170 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
2d180 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75  );.  if( !useJou
2d190 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67  rnal ){.    pPag
2d1a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
2d1b0 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
2d1c0 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65  ODE_OFF;.  }else
2d1d0 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20   if( memDb ){.  
2d1e0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2d1f0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
2d200 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
2d210 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
2d220 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
2d230 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2d240 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
2d250 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  rArg = 0; */.  p
2d260 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
2d270 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a   = xReinit;.  /*
2d280 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
2d290 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
2d2a0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
2d2b0 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72  ; */..  *ppPager
2d2c0 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
2d2d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2d2e0 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ..../*.** This f
2d2f0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2d300 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69  d after transiti
2d310 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52  oning from PAGER
2d320 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41  _UNLOCK to.** PA
2d330 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
2d340 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68  . It tests if th
2d350 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
2d360 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a  rnal present in.
2d370 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
2d380 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  em for the given
2d390 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f   pager. A hot jo
2d3a0 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61  urnal is one tha
2d3b0 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  t .** needs to b
2d3c0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41  e played back. A
2d3d0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73  ccording to this
2d3e0 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74   function, a hot
2d3f0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65  -journal.** file
2d400 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66   exists if the f
2d410 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
2d420 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  a are met:.**.**
2d430 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c     * The journal
2d440 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20   file exists in 
2d450 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  the file system,
2d460 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70   and.**   * No p
2d470 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
2d480 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2d490 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
2d4a0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
2d4b0 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  d.**   * The dat
2d4c0 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
2d4d0 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  f is greater tha
2d4e0 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n 0 bytes in siz
2d4f0 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
2d500 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
2d510 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d520 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e   exists and is n
2d530 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49  ot 0x00..**.** I
2d540 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
2d550 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
2d560 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
2d570 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
2d580 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
2d590 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
2d5a0 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
2d5b0 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
2d5c0 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
2d5d0 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
2d5e0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2d5f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2d600 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74  is.** just delet
2d610 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74  ed using OsDelet
2d620 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  e, *pExists is s
2d630 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
2d640 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
2d650 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
2d660 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
2d670 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65  t check if there
2d680 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   is a master jou
2d690 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a  rnal filename.**
2d6a0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2d6b0 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  he file. If ther
2d6c0 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d  e is, and that m
2d6d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
2d6e0 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  le.** does not e
2d6f0 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a  xist, then the j
2d700 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
2d710 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49  ot really hot. I
2d720 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74  n this.** case t
2d730 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2d740 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d   return a false-
2d750 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61  positive. The pa
2d760 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a  ger_playback().*
2d770 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  * routine will d
2d780 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65  iscover that the
2d790 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2d7a0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20   not really hot 
2d7b0 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  and .** will not
2d7c0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a   roll it back. .
2d7d0 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a  **.** If a hot-j
2d7e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66  ournal file is f
2d7f0 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a  ound to exist, *
2d800 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
2d810 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  o 1 and .** SQLI
2d820 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
2d830 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  If no hot-journa
2d840 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
2d850 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a  t, *pExists is.*
2d860 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  * set to 0 and S
2d870 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2d880 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
2d890 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
2d8a0 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65  rying.** to dete
2d8b0 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
2d8c0 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   not a hot-journ
2d8d0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
2d8e0 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20  the IO error.** 
2d8f0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2d900 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
2d910 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e  f *pExists is un
2d920 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
2d930 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
2d940 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
2d950 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73  er, int *pExists
2d960 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
2d970 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
2d980 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
2d990 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d9a0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  OK;           /*
2d9b0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2d9c0 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31    int exists = 1
2d9d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d9e0 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75  /* True if a jou
2d9f0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
2da00 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72  sent */.  int jr
2da10 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65  nlOpen = !!isOpe
2da20 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
2da30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2da40 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
2da50 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
2da60 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
2da70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2da80 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2da90 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65  _OPEN );..  asse
2daa0 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20  rt( jrnlOpen==0 
2dab0 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65  || ( sqlite3OsDe
2dac0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2dad0 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ics(pPager->jfd)
2dae0 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f   &.    SQLITE_IO
2daf0 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
2db00 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a  WHEN_OPEN.  ));.
2db10 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
2db20 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e  .  if( !jrnlOpen
2db30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
2db40 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
2db50 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2db60 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
2db70 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
2db80 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ts);.  }.  if( r
2db90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2dba0 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
2dbb0 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20  t locked = 0;   
2dbc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2dbd0 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
2dbe0 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
2dbf0 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
2dc00 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
2dc10 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
2dc20 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
2dc30 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
2dc40 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
2dc50 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
2dc60 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
2dc70 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
2dc80 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
2dc90 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
2dca0 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
2dcb0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
2dcc0 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
2dcd0 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
2dce0 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
2dcf0 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
2dd00 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2dd10 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
2dd20 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
2dd30 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
2dd40 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
2dd50 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
2dd60 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
2dd70 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
2dd80 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
2dd90 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
2dda0 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
2ddb0 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
2ddc0 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
2ddd0 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
2dde0 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
2ddf0 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
2de00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
2de10 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
2de20 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
2de30 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
2de40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
2de50 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ocked ){.      P
2de60 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
2de70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2de80 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
2de90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2dea0 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  /..      /* Chec
2deb0 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  k the size of th
2dec0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ded0 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20   If it consists 
2dee0 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20  of 0 pages,.    
2def0 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65    ** then delete
2df00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2df10 65 2e 20 53 65 65 20 74 68 65 20 68 65 61 64 65  e. See the heade
2df20 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  r comment above 
2df30 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  for .      ** th
2df40 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65  e reasoning here
2df50 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62  .  Delete the ob
2df60 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
2df70 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20  ile under.      
2df80 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ** a RESERVED lo
2df90 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65  ck to avoid race
2dfa0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20   conditions and 
2dfb0 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69  to avoid violati
2dfc0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33  ng.      ** [H33
2dfd0 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  020]..      */. 
2dfe0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
2dff0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
2e000 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
2e010 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e020 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
2e030 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
2e040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
2e050 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
2e060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2e070 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
2e080 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ger, RESERVED_LO
2e090 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  CK)==SQLITE_OK )
2e0a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2e0b0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
2e0c0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2e0d0 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
2e0e0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2e0f0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2e100 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   ) pagerUnlockDb
2e110 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
2e120 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
2e130 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
2e140 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
2e150 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  loc();.        }
2e160 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2e170 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
2e180 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e  ile exists and n
2e190 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
2e1a0 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65  on has a reserve
2e1b0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
2e1c0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
2e1d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2e1e0 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74  ile. Now check t
2e1f0 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20  hat there is.   
2e200 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61         ** at lea
2e210 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20  st one non-zero 
2e220 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61  bytes at the sta
2e230 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
2e240 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
2e250 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73    ** If there is
2e260 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64  , then we consid
2e270 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  er this journal 
2e280 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f  to be hot. If no
2e290 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  t, .          **
2e2a0 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72   it can be ignor
2e2b0 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ed..          */
2e2c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2e2d0 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2e2e0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
2e2f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2e300 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
2e310 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
2e320 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2e330 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2e340 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2e350 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
2e360 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20  d, f, &f);.     
2e370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e390 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2e3a0 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a    u8 first = 0;.
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2e3c0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
2e3d0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69  Pager->jfd, (voi
2e3e0 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30  d *)&first, 1, 0
2e3f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2e400 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
2e410 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
2e420 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e430 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e440 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e450 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
2e460 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
2e470 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2e480 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
2e490 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
2e4a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2e4b0 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73  *pExists = (firs
2e4c0 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t!=0);.         
2e4d0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2e4e0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
2e4f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
2e500 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70   If we cannot op
2e510 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
2e520 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
2e530 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a  order to see if.
2e540 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
2e550 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65  ts has a zero he
2e560 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74  ader, that might
2e570 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f   be due to an I/
2e580 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20  O error, or.    
2e590 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69          ** it mi
2e5a0 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68  ght be due to th
2e5b0 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  e race condition
2e5c0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
2e5d0 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20   and in.        
2e5e0 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33      ** ticket #3
2e5f0 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79  883.  Either way
2e600 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
2e610 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
2e620 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
2e630 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61   This might be a
2e640 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e   false positive.
2e650 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20    But if it is, 
2e660 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
2e670 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
2e680 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  c journal playba
2e690 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20  ck and recovery 
2e6a0 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64  mechanism will d
2e6b0 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eal.            
2e6c0 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72  ** with it under
2e6d0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
2e6e0 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  ck where we do n
2e6f0 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ot need to.     
2e700 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20         ** worry 
2e710 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63  so much with rac
2e720 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20  e conditions..  
2e730 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2e740 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
2e750 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
2e760 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2e770 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
2e780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e790 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2e7a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2e7b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e7c0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
2e7d0 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
2e7e0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2e7f0 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73  e file..** It is
2e800 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c   illegal to call
2e810 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
2e820 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74  uire() until aft
2e830 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
2e840 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63  .** has been suc
2e850 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64  cessfully called
2e860 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f  . If a shared-lo
2e870 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
2e880 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20  ld when.** this 
2e890 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2e8a0 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
2e8b0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  p..**.** The fol
2e8c0 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  lowing operation
2e8d0 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f  s are also perfo
2e8e0 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rmed by this fun
2e8f0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31  ction..**.**   1
2e900 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
2e910 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50  s currently in P
2e920 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20  AGER_OPEN state 
2e930 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a  (no lock held.**
2e940 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74        on the dat
2e950 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65  abase file), the
2e960 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
2e970 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  made to obtain a
2e980 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20  .**      SHARED 
2e990 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2e9a0 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64  base file. Immed
2e9b0 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74  iately after obt
2e9c0 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  aining.**      t
2e9d0 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
2e9e0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2e9f0 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61  is checked for a
2ea00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a   hot-journal,.**
2ea10 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70        which is p
2ea20 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72  layed back if pr
2ea30 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67  esent. Following
2ea40 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   any hot-journal
2ea50 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61   .**      rollba
2ea60 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ck, the contents
2ea70 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72   of the cache ar
2ea80 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63  e validated by c
2ea90 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  hecking.**      
2eaa0 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e  the 'change-coun
2eab0 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68  ter' field of th
2eac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ead0 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20  header and.**   
2eae0 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20     discarded if 
2eaf0 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74  they are found t
2eb00 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a  o be invalid..**
2eb10 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20  .**   2) If the 
2eb20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
2eb30 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f   in exclusive-mo
2eb40 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  de, and there ar
2eb50 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  e currently.**  
2eb60 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69      no outstandi
2eb70 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
2eb80 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20   any pages, and 
2eb90 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
2eba0 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74  state,.**      t
2ebb0 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
2ebc0 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20  s made to clear 
2ebd0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2ebe0 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a  by discarding.**
2ebf0 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e        the conten
2ec00 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63  ts of the page c
2ec10 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67  ache and rolling
2ec20 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a   back any open j
2ec30 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66  ournal.**      f
2ec40 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ile..**.** If ev
2ec50 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
2ec60 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
2ec70 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
2ec80 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a  f an IO error .*
2ec90 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c  * occurs while l
2eca0 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62  ocking the datab
2ecb0 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f  ase, checking fo
2ecc0 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
2ecd0 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c  file or .** roll
2ece0 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
2ecf0 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20  al file, the IO 
2ed00 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2ed10 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
2ed20 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
2ed30 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
2ed40 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2ed50 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2ed60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2ed70 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
2ed80 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
2ed90 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
2eda0 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f  rom b-tree and o
2edb0 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61  nly when there a
2edc0 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74  re no.  ** outst
2edd0 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68  anding pages. Th
2ede0 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  is implies that 
2edf0 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20  the pager state 
2ee00 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20  should either.  
2ee10 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45  ** be OPEN or RE
2ee20 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20  ADER. READER is 
2ee30 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66  only possible if
2ee40 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72   the pager is or
2ee50 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78   was in .  ** ex
2ee60 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d  clusive access m
2ee70 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
2ee80 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
2ee90 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
2eea0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
2eeb0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
2eec0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
2eed0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
2eee0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
2eef0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
2ef00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2ef10 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
2ef20 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d  .  if( NEVER(MEM
2ef30 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  DB && pPager->er
2ef40 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e  rCode) ){ return
2ef50 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2ef60 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67 65  ; }..  if( !page
2ef70 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2ef80 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
2ef90 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b  e==PAGER_OPEN ){
2efa0 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75  .    int bHotJou
2efb0 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20  rnal = 1;       
2efc0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2efd0 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f 74  ere exists a hot
2efe0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f   journal-file */
2eff0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ..    assert( !M
2f000 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72 63 20  EMDB );..    rc 
2f010 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
2f020 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
2f030 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  RED_LOCK);.    i
2f040 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f050 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2f060 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
2f070 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  =NO_LOCK || pPag
2f080 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
2f090 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
2f0a0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2f0b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
2f0c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2f0d0 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
2f0e0 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
2f0f0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
2f100 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
2f110 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
2f120 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
2f130 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
2f140 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
2f150 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
2f160 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  <=SHARED_LOCK ){
2f170 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48  .      rc = hasH
2f180 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
2f190 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b  , &bHotJournal);
2f1a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2f1b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f1c0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
2f1d0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
2f1e0 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a   bHotJournal ){.
2f1f0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
2f200 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2f210 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2f220 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
2f230 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  nt it is.      *
2f240 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
2f250 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
2f260 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
2f270 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
2f280 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  he.      ** EXCL
2f290 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
2f2a0 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
2f2b0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
2f2c0 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
2f2d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
2f2e0 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
2f2f0 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
2f300 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
2f310 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
2f320 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
2f330 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
2f340 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
2f350 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  ling the .      
2f360 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62  ** hot-journal b
2f370 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  ack..      ** . 
2f380 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
2f390 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
2f3a0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
2f3b0 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
2f3c0 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74   any.      ** ot
2f3d0 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65  her process atte
2f3e0 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73  mpting to access
2f3f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f400 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a  le will get to .
2f410 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f        ** this po
2f420 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
2f430 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61  and fail to obta
2f440 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55  in its own EXCLU
2f450 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20  SIVE lock .     
2f460 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
2f470 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
2f480 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65  **.      ** Unle
2f490 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
2f4a0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
2f4b0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
2f4c0 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20  the lock is.    
2f4d0 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20    ** downgraded 
2f4e0 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62  to SHARED_LOCK b
2f4f0 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
2f500 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20  ion returns..   
2f510 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2f520 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
2f530 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
2f540 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
2f550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f560 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
2f570 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a  iled;.      }. .
2f580 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69        /* If it i
2f590 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
2f5a0 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  en and the file 
2f5b0 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
2f5c0 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  open the .      
2f5d0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  ** journal for r
2f5e0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
2f5f0 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20 69  . Write access i
2f600 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75  s required becau
2f610 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  se .      ** in 
2f620 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
2f630 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64   mode the file d
2f640 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
2f650 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20  e kept open .   
2f660 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62     ** and possib
2f670 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72  ly used for a tr
2f680 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20  ansaction later 
2f690 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d  on. Also, write-
2f6a0 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  access .      **
2f6b0 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75   is usually requ
2f6c0 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ired to finalize
2f6d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20   the journal in 
2f6e0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72  journal_mode=per
2f6f0 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  sist .      ** m
2f700 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f  ode (and also fo
2f710 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74  r journal_mode=t
2f720 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20  runcate on some 
2f730 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20  systems)..      
2f740 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
2f750 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  he journal does 
2f760 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73  not exist, it us
2f770 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  ually means that
2f780 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20   some .      ** 
2f790 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2f7a0 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20   managed to get 
2f7b0 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62  in and roll it b
2f7c0 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20  ack before .    
2f7d0 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63    ** this connec
2f7e0 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68  tion obtained th
2f7f0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
2f800 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a   above. Or, it .
2f810 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61        ** may mea
2f820 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  n that the pager
2f830 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f   was in the erro
2f840 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
2f850 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
2f860 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61  ion was called a
2f870 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
2f880 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
2f890 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
2f8a0 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
2f8b0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
2f8c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
2f8d0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
2f8e0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
2f8f0 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78 69          int bExi
2f900 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  sts;            
2f910 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
2f920 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2f930 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
2f940 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2f950 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  (.            pV
2f960 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2f970 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
2f980 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78  ESS_EXISTS, &bEx
2f990 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69  ists);.        i
2f9a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f9b0 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20   && bExists ){. 
2f9c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
2f9d0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2f9e0 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
2f9f0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
2fa00 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2fa10 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
2fa20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2fa30 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
2fa40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2fa50 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2fa60 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2fa70 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
2fa80 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
2fa90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
2faa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2fab0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2fac0 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
2fad0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2fae0 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
2faf0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
2fb00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2fb10 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
2fb20 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
2fb30 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
2fb40 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
2fb50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2fb60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2fb70 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
2fb80 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
2fb90 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
2fba0 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
2fbb0 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
2fbc0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
2fbd0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
2fbe0 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
2fbf0 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
2fc00 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
2fc10 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
2fc20 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
2fc30 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
2fc40 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
2fc50 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63  ent cache.  Sync
2fc60 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
2fc70 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a   before playing.
2fc80 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b        ** it back
2fc90 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65   since the proce
2fca0 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20  ss that crashed 
2fcb0 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74  and left the hot
2fcc0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
2fcd0 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e  * probably did n
2fce0 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77  ot sync it and w
2fcf0 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
2fd00 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20  o always sync.  
2fd10 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
2fd20 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
2fd30 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20  g it back..     
2fd40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
2fd50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2fd60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
2fd70 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2fd80 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OK );.        rc
2fd90 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a   = pagerSyncHotJ
2fda0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
2fdb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2fdc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fdd0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
2fde0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
2fdf0 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 1);.         
2fe00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
2fe10 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
2fe20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2fe30 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
2fe40 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
2fe50 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55  {.        pagerU
2fe60 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
2fe70 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2fe80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2fe90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2fea0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
2feb0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
2fec0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
2fed0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
2fee0 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20  g to open.      
2fef0 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63    ** or roll bac
2ff00 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
2ff10 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e  while holding an
2ff20 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2ff30 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
2ff40 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72  pager_unlock() r
2ff50 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
2ff60 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74  alled before ret
2ff70 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b  urning to unlock
2ff80 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2ff90 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c  file. If the unl
2ffa0 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ock attempt fail
2ffb0 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c  s, then Pager.eL
2ffc0 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ock must be.    
2ffd0 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e      ** set to UN
2ffe0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20  KNOWN_LOCK (see 
2fff0 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
30000 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
30010 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e  r .        ** UN
30020 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65  KNOWN_LOCK above
30030 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
30040 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a  ion). .        *
30050 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
30060 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67  order to get pag
30070 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64  er_unlock() to d
30080 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65  o this, set Page
30090 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20  r.eState to.    
300a0 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52      ** PAGER_ERR
300b0 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  OR now. This is 
300c0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75  not actually cou
300d0 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69  nted as a transi
300e0 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
300f0 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  to ERROR state i
30100 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67  n the state diag
30110 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ram at the top o
30120 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20  f this file,.   
30130 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65       ** since we
30140 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73   know that the s
30150 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ame call to page
30160 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
30170 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  very.        ** 
30180 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69  shortly transiti
30190 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  on the pager obj
301a0 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20  ect to the OPEN 
301b0 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20  state. Calling. 
301c0 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74         ** assert
301d0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77  _pager_state() w
301e0 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61  ould fail now, a
301f0 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  s it should not 
30200 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  be possible.    
30210 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20      ** to be in 
30220 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
30230 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20   there are zero 
30240 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
30250 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66   .        ** ref
30260 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20  erences..       
30270 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
30280 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
30290 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  rc);.        got
302a0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
302b0 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
302c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
302d0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
302e0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
302f0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41  ager->eLock==SHA
30300 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
30310 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
30320 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
30330 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  & pPager->eLock>
30340 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
30350 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
30360 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
30370 6d 70 46 69 6c 65 20 0a 20 20 20 20 20 26 26 20  mpFile .     && 
30380 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
30390 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68   || sqlite3Pcach
303a0 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
303b0 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 29 20 0a  r->pPCache)>0) .
303c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
303d0 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  The shared-lock 
303e0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63  has just been ac
303f0 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61  quired on the da
30400 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20  tabase file.    
30410 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
30420 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73  re already pages
30430 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66   in the cache (f
30440 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20  rom a previous. 
30450 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20       ** read or 
30460 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
30470 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  n).  Check to se
30480 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
30490 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62  e.      ** has b
304a0 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49  een modified.  I
304b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
304c0 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73  as changed, flus
304d0 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  h the.      ** c
304e0 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ache..      **. 
304f0 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65       ** Database
30500 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65   changes is dete
30510 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  cted by looking 
30520 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69  at 15 bytes begi
30530 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  nning.      ** a
30540 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f  t offset 24 into
30550 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
30560 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65  first 4 of these
30570 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20   16 bytes are.  
30580 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20      ** a 32-bit 
30590 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20  counter that is 
305a0 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68  incremented with
305b0 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54   each change.  T
305c0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  he.      ** othe
305d0 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72  r bytes change r
305e0 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63  andomly with eac
305f0 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68  h file change wh
30600 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  en.      ** a co
30610 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
30620 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
30630 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
30640 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
30650 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
30660 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
30670 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74  .      ** detect
30680 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20  ed.  The chance 
30690 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64  of an undetected
306a0 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d   change is so sm
306b0 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a  all that.      *
306c0 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c  * it can be negl
306d0 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ected..      */.
306e0 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
306f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
30700 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
30710 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
30720 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20  eVers)];..      
30730 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
30740 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
30750 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
30760 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b  c ) goto failed;
30770 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ..      if( nPag
30780 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49  e>0 ){.        I
30790 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
307a0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
307b0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
307c0 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
307d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
307e0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
307f0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
30800 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
30810 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  24);.        if(
30820 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30830 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
30840 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
30850 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
30860 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64          memset(d
30870 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69  bFileVers, 0, si
30880 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
30890 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
308a0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61    if( memcmp(pPa
308b0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
308c0 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
308d0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
308e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
308f0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
30900 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
30910 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
30920 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65  re is a WAL file
30930 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
30940 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64  tem, open this d
30950 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20  atabase in WAL. 
30960 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65     ** mode. Othe
30970 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f  rwise, the follo
30980 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  wing function ca
30990 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
309a0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
309b0 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
309c0 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69  sent(pPager);.#i
309d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
309e0 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74  T_WAL.    assert
309f0 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d  ( pPager->pWal==
30a00 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
30a10 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  OK );.#endif.  }
30a20 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
30a30 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
30a40 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
30a50 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
30a60 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52  rc = pagerBeginR
30a70 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
30a80 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
30a90 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
30aa0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
30ab0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30ac0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
30ad0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
30ae0 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  , &pPager->dbSiz
30af0 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64  e);.  }.. failed
30b00 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
30b10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
30b20 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
30b30 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
30b40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
30b50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
30b60 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30b70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30b80 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
30b90 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
30ba0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
30bb0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
30bc0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
30bd0 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f  has reached zero
30be0 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  , rollback any a
30bf0 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
30c00 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tion and unlock 
30c10 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  the pager..**.**
30c20 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b   Except, in lock
30c30 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
30c40 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  VE when there is
30c50 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a   nothing to in.*
30c60 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
30c70 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f  ournal, the unlo
30c80 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72  ck is not perfor
30c90 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73  med and there is
30ca0 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72  .** nothing to r
30cb0 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73  ollback, so this
30cc0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
30cd0 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  -op..*/ .static 
30ce0 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
30cf0 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a  IfUnused(Pager *
30d00 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28  pPager){.  if( (
30d10 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
30d20 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
30d30 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20  Cache)==0) ){.  
30d40 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
30d50 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
30d60 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
30d70 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e  cquire a referen
30d80 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ce to page numbe
30d90 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20  r pgno in pager 
30da0 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a  pPager (a page.*
30db0 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20  * reference has 
30dc0 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49  type DbPage*). I
30dd0 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
30de0 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a  reference is .**
30df0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62   successfully ob
30e00 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f  tained, it is co
30e10 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20  pied to *ppPage 
30e20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
30e30 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
30e40 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
30e50 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
30e60 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
30e70 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
30e80 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
30e90 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
30ea0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
30eb0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
30ec0 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
30ed0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30ee0 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
30ef0 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
30f00 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
30f10 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
30f20 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
30f30 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
30f40 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
30f50 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
30f60 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
30f70 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
30f80 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
30f90 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
30fa0 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
30fb0 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
30fc0 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
30fd0 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
30fe0 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
30ff0 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
31000 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
31010 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
31020 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
31030 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
31040 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
31050 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
31060 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
31070 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
31080 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
31090 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
310a0 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
310b0 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
310c0 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
310d0 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  f a .** non-zero
310e0 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64   value is passed
310f0 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   as the noConten
31100 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20  t parameter and 
31110 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
31120 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  d page is not al
31130 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20  ready stored in 
31140 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20  the cache, then 
31150 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69  no .** actual di
31160 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20  sk read occurs. 
31170 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
31180 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
31190 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73   the .** page is
311a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
311b0 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a  all zeros. .**.*
311c0 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
311d0 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
311e0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
311f0 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63  care about the c
31200 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
31210 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63  e page. This occ
31220 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65 72  urs in two seper
31230 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  ate scenarios:.*
31240 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72  *.**   a) When r
31250 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69  eading a free-li
31260 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  st leaf page fro
31270 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
31280 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57  and.**.**   b) W
31290 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
312a0 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
312b0 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64  back and we need
312c0 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   to load.**     
312d0 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f   a new page into
312e0 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65   the cache to be
312f0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
31300 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20   data read.**   
31310 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65     from the save
31320 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  point journal..*
31330 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
31340 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
31350 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
31360 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
31370 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20  ead of.** being 
31380 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
31390 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
313a0 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
313b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
313c0 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
313d0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
313e0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
313f0 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
31400 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
31410 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
31420 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
31430 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
31440 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
31450 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
31460 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
31470 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
31480 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
31490 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
314a0 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
314b0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
314c0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
314d0 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
314e0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
314f0 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
31500 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
31510 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
31520 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
31530 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
31540 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
31550 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
31560 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
31570 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
31580 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
31590 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
315a0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
315b0 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
315c0 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
315d0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
315e0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
315f0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
31600 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
31610 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
31620 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
31630 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
31640 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
31650 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
31660 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
31670 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
31680 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
31690 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
316a0 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
316b0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
316c0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
316d0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
316e0 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
316f0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
31700 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
31710 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
31720 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
31730 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
31740 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
31750 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
31760 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
31770 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
31780 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
31790 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
317a0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
317b0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
317c0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
317d0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
317e0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
317f0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
31800 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
31810 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
31820 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  here */.  int no
31830 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a  Content       /*
31840 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72   Do not bother r
31850 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66  eading content f
31860 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65  rom disk if true
31870 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
31880 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
31890 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
318a0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
318b0 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
318c0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
318d0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
318e0 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  ;..  if( pgno==0
318f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
31900 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
31910 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
31920 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
31930 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
31940 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
31950 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a  r immediately. .
31960 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
31970 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65  request the page
31980 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65   from the PCache
31990 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28   layer. */.  if(
319a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
319b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
319c0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
319d0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
319e0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
319f0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
31a00 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
31a10 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b  gno, 1, ppPage);
31a20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
31a30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31a40 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63   /* Either the c
31a50 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63  all to sqlite3Pc
31a60 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75  acheFetch() retu
31a70 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72  rned an error or
31a80 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
31a90 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e  r was already in
31aa0 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
31ab0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
31ac0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ion was called..
31ad0 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74      ** Set pPg t
31ae0 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  o 0 and jump to 
31af0 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61  the exception ha
31b00 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70  ndler.  */.    p
31b10 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  Pg = 0;.    goto
31b20 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
31b30 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rr;.  }.  assert
31b40 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
31b50 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
31b60 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
31b70 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
31b80 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  | (*ppPage)->pPa
31b90 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ger==0 );..  if(
31ba0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
31bb0 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74  er && !noContent
31bc0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
31bd0 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63  is case the pcac
31be0 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  he already conta
31bf0 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  ins an initializ
31c00 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a  ed copy of.    *
31c10 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75  * the page. Retu
31c20 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68  rn without furth
31c30 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20  er ado.  */.    
31c40 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41  assert( pgno<=PA
31c50 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20  GER_MAX_PGNO && 
31c60 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
31c70 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
31c80 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
31c90 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d  [PAGER_STAT_HIT]
31ca0 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ++;.    return S
31cb0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
31cc0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
31cd0 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
31ce0 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
31cf0 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
31d00 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
31d10 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
31d20 20 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20 2a   */..    pPg = *
31d30 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d  ppPage;.    pPg-
31d40 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
31d50 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  ;..    /* The ma
31d60 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
31d70 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
31d80 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
31d90 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a   if a page.    *
31da0 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
31db0 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74   than this, or t
31dc0 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e  he unused lockin
31dd0 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65  g-page, is reque
31de0 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
31df0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
31e00 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
31e10 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
31e20 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
31e30 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
31e40 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
31e50 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
31e60 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
31e70 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61  if( MEMDB || pPa
31e80 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f  ger->dbSize<pgno
31e90 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c   || noContent ||
31ea0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
31eb0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  >fd) ){.      if
31ec0 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
31ed0 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
31ee0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
31ef0 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  L;.        goto 
31f00 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
31f10 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
31f20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
31f30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
31f40 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
31f50 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
31f60 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
31f70 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
31f80 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
31f90 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
31fa0 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
31fb0 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
31fc0 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
31fd0 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
31fe0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
31ff0 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
32000 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
32010 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
32020 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
32030 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
32040 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
32050 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
32060 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
32070 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
32080 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
32090 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
320a0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
320b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
320c0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
320d0 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
320e0 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
320f0 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
32100 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
32110 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
32120 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
32130 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
32140 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
32150 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
32160 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
32170 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
32180 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
32190 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
321a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
321b0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
321c0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
321d0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a  lloc();.      }.
321e0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
321f0 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
32200 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
32210 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
32220 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
32230 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
32240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
32250 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
32260 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
32270 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
32280 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53  t[PAGER_STAT_MIS
32290 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d  S]++;.      rc =
322a0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
322b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
322c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
322d0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
322e0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
322f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
32300 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
32310 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  h(pPg);.  }..  r
32320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32330 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  ..pager_acquire_
32340 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72  err:.  assert( r
32350 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
32360 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
32370 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
32380 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  op(pPg);.  }.  p
32390 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
323a0 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a  ed(pPager);..  *
323b0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
323c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
323d0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
323e0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
323f0 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
32400 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
32410 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
32420 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
32430 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
32440 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
32450 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
32460 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
32470 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  . .**.** See als
32480 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
32490 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
324a0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
324b0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
324c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
324d0 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
324e0 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
324f0 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
32500 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
32510 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
32520 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
32530 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
32540 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
32550 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
32560 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
32570 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
32580 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
32590 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
325a0 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
325b0 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
325c0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
325d0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
325e0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
325f0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
32600 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
32610 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
32620 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29  er->pPCache!=0 )
32630 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
32640 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
32650 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67  R_READER && pPag
32660 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
32670 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 73 71 6c  R_ERROR );.  sql
32680 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
32690 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
326a0 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b   pgno, 0, &pPg);
326b0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
326c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
326d0 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
326e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
326f0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
32700 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
32710 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
32720 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
32730 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
32740 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
32750 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
32760 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
32770 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
32780 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
32790 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
327a0 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
327b0 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69   removed..*/.voi
327c0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
327d0 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
327e0 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  {.  if( pPg ){. 
327f0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
32800 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
32810 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
32820 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
32830 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66     pagerUnlockIf
32840 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
32850 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
32860 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
32870 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72  lled at the star
32880 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65  t of every write
32890 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
328a0 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65   There must alre
328b0 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
328c0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
328d0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
328e0 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  ase .** file whe
328f0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
32900 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
32910 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
32920 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
32930 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65  pPager and write
32940 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
32950 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72  r.** to the star
32960 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72  t of it. If ther
32970 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
32980 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68  epoints, open th
32990 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
329a0 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66   as well. This f
329b0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
329c0 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f  used when the jo
329d0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
329e0 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74  ing .** opened t
329f0 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61  o write a rollba
32a00 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61  ck log for a tra
32a10 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
32a20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65  not used .** whe
32a30 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20  n opening a hot 
32a40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
32a50 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
32a60 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
32a70 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61  al file is alrea
32a80 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d  dy open (as it m
32a90 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69  ay be in exclusi
32aa0 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65  ve mode),.** the
32ab0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
32ac0 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f  just writes a jo
32ad0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
32ae0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
32af0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  .** already open
32b00 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68   file. .**.** Wh
32b10 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
32b20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
32b30 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
32b40 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  function, the.**
32b50 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
32b60 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  l bitvec structu
32b70 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  re is allocated.
32b80 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
32b90 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
32ba0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
32bb0 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ful. Otherwise, 
32bc0 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
32bd0 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61  E_NOMEM if the a
32be0 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
32bf0 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  te Pager.pInJour
32c00 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
32c10 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  * an IO error co
32c20 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72  de if opening or
32c30 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
32c40 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e  rnal file fails.
32c50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
32c60 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
32c70 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
32c80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
32c90 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
32ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32cb0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
32cc0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
32cd0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
32ce0 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a  ager->pVfs;   /*
32cf0 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
32d00 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a  vfs pointer */..
32d10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32d20 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32d30 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
32d40 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
32d50 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
32d60 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
32d70 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
32d80 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20  urnal==0 );.  . 
32d90 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69   /* If already i
32da0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
32db0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
32dc0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75   is a no-op.  Bu
32dd0 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74  t on.  ** the ot
32de0 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72  her hand, this r
32df0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
32e00 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65  called if we are
32e10 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a   already in.  **
32e20 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e   an error state.
32e30 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
32e40 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
32e50 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
32e60 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66  ->errCode;..  if
32e70 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
32e80 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
32e90 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
32ea0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32eb0 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67  _OFF ){.    pPag
32ec0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
32ed0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
32ee0 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
32ef0 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
32f00 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
32f10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
32f20 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
32f30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
32f40 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
32f50 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
32f60 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
32f70 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69  n. */.    if( !i
32f80 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
32f90 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
32fa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
32fb0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
32fc0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
32fd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32fe0 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
32ff0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
33000 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33010 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
33020 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  s =             
33030 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
33040 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e  gs to open journ
33050 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  al file */.     
33060 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
33070 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
33080 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
33090 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
330a0 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20  ->tempFile ? .  
330b0 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
330c0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
330d0 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
330e0 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a  _TEMP_JOURNAL):.
330f0 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
33100 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
33110 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20  URNAL).         
33120 20 29 3b 0a 20 20 23 69 66 64 65 66 20 53 51 4c   );.  #ifdef SQL
33130 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
33140 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  C_WRITE.        
33150 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
33160 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20  nalOpen(.       
33170 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
33180 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
33190 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
331a0 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
331b0 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20  pPager).        
331c0 29 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20  );.  #else.     
331d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
331e0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
331f0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
33200 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
33210 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20  , 0);.  #endif. 
33220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
33230 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
33240 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
33250 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
33260 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20   }.  .  .    /* 
33270 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  Write the first 
33280 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
33290 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
332a0 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20  le and open .   
332b0 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
332c0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
332d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
332e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
332f0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  {.      /* TODO:
33300 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66   Check if all of
33310 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c   these are reall
33320 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  y required. */. 
33330 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
33340 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  c = 0;.      pPa
33350 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
33360 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
33370 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
33380 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
33390 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
333a0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
333b0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
333c0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
333d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
333e0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
333f0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
33400 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
33410 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
33420 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
33430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
33440 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
33450 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
33460 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
33470 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
33480 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
33490 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72  CHEMOD;.  }..  r
334a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
334b0 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65  ** Begin a write
334c0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
334d0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
334e0 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
334f0 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73   .** write-trans
33500 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
33510 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  dy been opened, 
33520 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
33530 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
33540 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72  If the exFlag ar
33550 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  gument is false,
33560 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
33570 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
33580 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  D.** lock on the
33590 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
335a0 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
335b0 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
335c0 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45  at least.** an E
335d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
335e0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
335f0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e   already held, n
33600 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75  o locking .** fu
33610 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20  nctions need be 
33620 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
33630 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
33640 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  y argument is no
33650 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  n-zero, then any
33660 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65   sub-journal ope
33670 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
33680 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  is transaction w
33690 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73  ill be opened as
336a0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
336b0 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20  le. This.** has 
336c0 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65  no effect if the
336d0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
336e0 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28  already opened (
336f0 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65  as it may be whe
33700 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20  n.** running in 
33710 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20  exclusive mode) 
33720 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  or if the transa
33730 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72  ction does not r
33740 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d  equire a.** sub-
33750 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20  journal. If the 
33760 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
33770 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74  ument is zero, t
33780 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64  hen any required
33790 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
337a0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  is implemented i
337b0 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67  n-memory if pPag
337c0 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  er is an in-memo
337d0 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a  ry database, .**
337e0 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70   or using a temp
337f0 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72  orary file other
33800 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
33810 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50  ite3PagerBegin(P
33820 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
33830 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75  t exFlag, int su
33840 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69  bjInMemory){.  i
33850 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
33860 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
33870 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
33880 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
33890 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  de;.  assert( pP
338a0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
338b0 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50  GER_READER && pP
338c0 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47  ager->eState<PAG
338d0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50  ER_ERROR );.  pP
338e0 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
338f0 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d  ry = (u8)subjInM
33900 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c  emory;..  if( AL
33910 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74  WAYS(pPager->eSt
33920 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
33930 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  R) ){.    assert
33940 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
33950 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  rnal==0 );..    
33960 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
33970 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
33980 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
33990 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74   is configured t
339a0 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  o use locking_mo
339b0 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e  de=exclusive, an
339c0 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78  d an.      ** ex
339d0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
339e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
339f0 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64  not already held
33a00 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e  , obtain it now.
33a10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33a20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
33a30 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c  usiveMode && sql
33a40 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
33a50 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
33a60 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  l, -1) ){.      
33a70 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
33a80 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  Db(pPager, EXCLU
33a90 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
33aa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33ac0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33ae0 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
33af0 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
33b00 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20  pWal, 1);.      
33b10 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62  }..      /* Grab
33b20 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
33b30 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  on the log file.
33b40 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
33b50 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20  upgrade to.     
33b60 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56   ** PAGER_RESERV
33b70 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  ED state. Otherw
33b80 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ise, return an e
33b90 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
33ba0 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
33bb0 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  * The busy-handl
33bc0 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65  er is not invoke
33bd0 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e  d if another con
33be0 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a  nection already.
33bf0 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74        ** holds t
33c00 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49  he write-lock. I
33c10 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
33c20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c  upper layer will
33c30 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20   call it..      
33c40 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
33c50 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69  lite3WalBeginWri
33c60 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  teTransaction(pP
33c70 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
33c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
33c90 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   Obtain a RESERV
33ca0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
33cb0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
33cc0 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61   the exFlag para
33cd0 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  meter.      ** i
33ce0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d  s true, then imm
33cf0 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65  ediately upgrade
33d00 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c   this to an EXCL
33d10 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
33d20 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61        ** busy-ha
33d30 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63  ndler callback c
33d40 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  an be used when 
33d50 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65  upgrading to the
33d60 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20   EXCLUSIVE.     
33d70 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f   ** lock, but no
33d80 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67  t when obtaining
33d90 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
33da0 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
33db0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
33dc0 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
33dd0 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
33de0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33df0 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b  _OK && exFlag ){
33e00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
33e10 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
33e20 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
33e30 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
33e40 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
33e50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33e60 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67  {.      /* Chang
33e70 65 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b  e to WRITER_LOCK
33e80 45 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  ED state..      
33e90 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20  **.      ** WAL 
33ea0 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65 72 2e  mode sets Pager.
33eb0 65 53 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f  eState to PAGER_
33ec0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72  WRITER_LOCKED or
33ed0 20 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20   CACHEMOD.      
33ee0 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 61  ** when it has a
33ef0 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  n open transacti
33f00 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f  on, but never to
33f10 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48   DBMOD or FINISH
33f20 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  ED..      ** Thi
33f30 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
33f40 74 68 6f 73 65 20 73 74 61 74 65 73 20 74 68 65  those states the
33f50 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61   code to roll ba
33f60 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  ck savepoint .  
33f70 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
33f80 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74  ons may copy dat
33f90 61 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  a from the sub-j
33fa0 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
33fb0 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20  database .      
33fc0 2a 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20  ** file as well 
33fd0 61 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  as into the page
33fe0 20 63 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f   cache. Which wo
33ff0 75 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74  uld be incorrect
34000 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41   in .      ** WA
34010 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  L mode..      */
34020 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
34030 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
34040 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  ITER_LOCKED;.   
34050 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e     pPager->dbHin
34060 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
34070 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
34080 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
34090 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
340a0 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
340b0 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50  >dbOrigSize = pP
340c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
340d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
340e0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
340f0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  }..    assert( r
34100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
34110 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
34120 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
34130 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
34140 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
34150 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
34160 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
34170 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
34180 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
34190 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
341a0 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
341b0 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
341c0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
341d0 67 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  ger)));.  return
341e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
341f0 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  rk a single data
34200 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
34210 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
34220 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
34230 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   .** main journa
34240 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
34250 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66   as required. If
34260 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
34270 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65  tten into.** one
34280 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
34290 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
342a0 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
342b0 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e  n the .** Pager.
342c0 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
342d0 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  c and the PagerS
342e0 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
342f0 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a  point bitvecs.**
34300 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76   of any open sav
34310 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f  epoints as appro
34320 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  priate..*/.stati
34330 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
34340 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
34350 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
34360 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67  Pg->pData;.  Pag
34370 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
34380 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
34390 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
343a0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
343b0 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ne is not called
343c0 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d   unless a write-
343d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
343e0 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65  already .  ** be
343f0 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65 20  en started. The 
34400 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
34410 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
34420 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e  pen at this poin
34430 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65  t..  ** It is ne
34440 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68  ver called in th
34450 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20  e ERROR state.. 
34460 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
34470 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
34480 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
34490 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
344a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
344b0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
344c0 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
344d0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
344e0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
344f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
34500 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
34510 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
34520 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
34530 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  s been previousl
34540 79 20 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f  y detected, repo
34550 72 74 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rt the same erro
34560 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 54 68  r.  ** again. Th
34570 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  is should not ha
34580 70 70 65 6e 2c 20 62 75 74 20 74 68 65 20 63 68  ppen, but the ch
34590 65 63 6b 20 70 72 6f 76 69 64 65 73 20 72 6f 62  eck provides rob
345a0 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66  ustness. */.  if
345b0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
345c0 65 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75  errCode) )  retu
345d0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
345e0 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72  de;..  /* Higher
345f0 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20  -level routines 
34600 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20  never call this 
34610 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61  function if data
34620 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  base is not.  **
34630 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20   writable.  But 
34640 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75  check anyway, ju
34650 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  st for robustnes
34660 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  s. */.  if( NEVE
34670 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  R(pPager->readOn
34680 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ly) ) return SQL
34690 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 43 48 45  ITE_PERM;..  CHE
346a0 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
346b0 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
346c0 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
346d0 20 6f 70 65 6e 65 64 2e 20 48 69 67 68 65 72 20   opened. Higher 
346e0 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 68  level routines h
346f0 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ave already.  **
34700 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65   obtained the ne
34710 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f  cessary locks to
34720 20 62 65 67 69 6e 20 74 68 65 20 77 72 69 74 65   begin the write
34730 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75  -transaction, bu
34740 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62  t the.  ** rollb
34750 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ack journal migh
34760 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65  t not yet be ope
34770 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69  n. Open it now i
34780 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
34790 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
347a0 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
347b0 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  e calling sqlite
347c0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
347d0 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  () on the page. 
347e0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
347f0 20 69 66 20 69 74 20 77 65 72 65 20 64 6f 6e 65   if it were done
34800 20 61 66 74 65 72 20 63 61 6c 6c 69 6e 67 20 73   after calling s
34810 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
34820 44 69 72 74 79 28 29 2c 20 74 68 65 6e 0a 20 20  Dirty(), then.  
34830 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69 67 68  ** an error migh
34840 74 20 6f 63 63 75 72 20 61 6e 64 20 74 68 65 20  t occur and the 
34850 70 61 67 65 72 20 77 6f 75 6c 64 20 65 6e 64 20  pager would end 
34860 75 70 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43  up in WRITER_LOC
34870 4b 45 44 20 73 74 61 74 65 0a 20 20 2a 2a 20 77  KED state.  ** w
34880 69 74 68 20 70 61 67 65 73 20 6d 61 72 6b 65 64  ith pages marked
34890 20 61 73 20 64 69 72 74 79 20 69 6e 20 74 68 65   as dirty in the
348a0 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69   cache..  */.  i
348b0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
348c0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
348d0 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 72 63  LOCKED ){.    rc
348e0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
348f0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
34900 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34910 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
34920 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
34930 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
34940 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
34950 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72  HEMOD );.  asser
34960 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
34970 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
34980 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
34990 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
349a0 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
349b0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
349c0 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
349d0 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
349e0 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
349f0 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73  t away..  */.  s
34a00 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
34a10 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
34a20 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
34a30 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71  pPg) && !subjReq
34a40 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
34a50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
34a60 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
34a70 72 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  r) );.  }else{. 
34a80 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
34a90 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
34aa0 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
34ab0 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
34ac0 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
34ad0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
34ae0 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
34af0 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
34b00 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
34b10 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
34b20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
34b30 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
34b40 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
34b50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
34b60 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
34b70 67 29 20 26 26 20 21 70 61 67 65 72 55 73 65 57  g) && !pagerUseW
34b80 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
34b90 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
34ba0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
34bb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
34bc0 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
34bd0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 26 26  r->dbOrigSize &&
34be0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
34bf0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
34c00 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20  u32 cksum;.     
34c10 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
34c20 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4f 66  .        i64 iOf
34c30 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
34c40 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20  nalOff;..       
34c50 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65   /* We should ne
34c60 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65  ver write to the
34c70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
34c80 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20  e page that.    
34c90 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
34ca0 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
34cb0 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
34cc0 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
34cd0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  es.        ** th
34ce0 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
34cf0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34d00 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
34d10 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
34d20 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  ) );..        as
34d30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
34d40 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65 72  urnalHdr<=pPager
34d50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
34d60 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70          CODEC2(p
34d70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
34d80 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
34d90 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
34da0 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
34db0 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
34dc0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
34dd0 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 20  8*)pData2);..   
34de0 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20       /* Even if 
34df0 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
34e00 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  l error occurs w
34e10 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  hile journalling
34e20 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
34e30 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63  page in the bloc
34e40 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65  k above, set the
34e50 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20   need-sync flag 
34e60 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20  for the page..  
34e70 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69        ** Otherwi
34e80 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61  se, when the tra
34e90 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
34ea0 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67  ed back, the log
34eb0 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ic in.        **
34ec0 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61   playback_one_pa
34ed0 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20  ge() will think 
34ee0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
34ef0 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eds to be restor
34f00 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ed.        ** in
34f10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34f20 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
34f30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
34f40 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
34f50 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f        ** then co
34f60 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c  rruption may fol
34f70 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  low..        */.
34f80 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
34f90 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
34fa0 5f 53 59 4e 43 3b 0a 0a 20 20 20 20 20 20 20 20  _SYNC;..        
34fb0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
34fc0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f  (pPager->jfd, iO
34fd0 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ff, pPg->pgno);.
34fe0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
34ff0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
35000 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72  rn rc;.        r
35010 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
35020 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
35030 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
35040 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34  pageSize, iOff+4
35050 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
35060 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
35070 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
35080 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
35090 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
350a0 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67  iOff+pPager->pag
350b0 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b  eSize+4, cksum);
350c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
350d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
350e0 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  urn rc;..       
350f0 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
35100 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
35110 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
35120 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
35130 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
35140 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65  ournalOff, pPage
35150 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20  r->pageSize));. 
35160 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43         PAGER_INC
35170 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
35180 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
35190 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
351a0 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E(("JOURNAL %d p
351b0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
351c0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
351d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50  ,.             P
351e0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
351f0 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
35200 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
35210 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
35220 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67  _SYNC)?1:0), pag
35230 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
35240 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 50 61  ));..        pPa
35250 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
35260 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70  += 8 + pPager->p
35270 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
35280 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
35290 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
352a0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
352b0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
352c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
352d0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
352e0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
352f0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
35300 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
35310 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
35320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
35330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
35340 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
35350 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d  );.        rc |=
35360 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
35370 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
35380 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
35390 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
353a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
353b0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
353c0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
353d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
353e0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
353f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35400 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
35410 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54  tate!=PAGER_WRIT
35420 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20  ER_DBMOD ){.    
35430 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
35440 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
35450 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  YNC;.        }. 
35460 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
35470 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61  E(("APPEND %d pa
35480 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
35490 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
354a0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
354b0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
354c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
354d0 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
354e0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
354f0 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  :0)));.      }. 
35500 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
35510 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
35520 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
35530 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
35540 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a  not in it,.    *
35550 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
35560 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
35570 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
35580 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
35590 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  at.    ** the st
355a0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
355b0 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
355c0 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
355d0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
355e0 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69      ** in that i
355f0 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
35600 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
35610 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
35620 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
35630 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20  sPage(pPg) ){.  
35640 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
35650 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
35660 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70    }.  }..  /* Up
35670 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
35680 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
35690 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  n..  */.  if( pP
356a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67  ager->dbSize<pPg
356b0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
356c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
356d0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20  Pg->pgno;.  }.  
356e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
356f0 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
35700 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
35710 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
35720 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
35730 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67  efore .** making
35740 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
35750 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ge. The caller m
35760 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65  ust check the re
35770 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f  turn value .** o
35780 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
35790 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
357a0 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79  ot to change any
357b0 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73   page data unles
357c0 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  s .** this routi
357d0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
357e0 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E_OK..**.** The 
357f0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
35800 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
35810 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
35820 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
35830 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
35840 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
35850 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
35860 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
35870 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
35880 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
35890 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
358a0 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
358b0 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
358c0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
358d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
358e0 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
358f0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
35900 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
35910 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20  SQLITE_NOMEM or 
35920 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
35930 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
35940 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
35950 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
35960 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
35970 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
35980 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
35990 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
359a0 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
359b0 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
359c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
359d0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
359e0 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
359f0 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
35a00 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
35a10 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
35a20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35a30 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
35a40 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
35a50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35a60 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
35a70 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
35a80 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
35a90 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
35aa0 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72  ..  if( nPagePer
35ab0 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
35ac0 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
35ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
35ae0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
35af0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
35b00 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
35b10 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
35b20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
35b30 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
35b40 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
35b50 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
35b60 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Page = 0;       
35b70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35b80 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
35b90 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
35ba0 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
35bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35bc0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
35bd0 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
35be0 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20  eedSync = 0;    
35bf0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
35c00 61 6e 79 20 70 61 67 65 20 68 61 73 20 50 47 48  any page has PGH
35c10 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a  DR_NEED_SYNC */.
35c20 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
35c30 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66  doNotSyncSpill f
35c40 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
35c50 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
35c60 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a  not allow.    **
35c70 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
35c80 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
35c90 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
35ca0 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20  s journaled by. 
35cb0 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
35cc0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
35cd0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
35ce0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
35cf0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
35d00 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pill==0 );.    p
35d10 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
35d20 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  Spill++;..    /*
35d30 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
35d40 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
35d50 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
35d60 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
35d70 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
35d80 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
35d90 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
35da0 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
35db0 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
35dc0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
35dd0 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
35de0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
35df0 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
35e00 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
35e10 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
35e20 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
35e30 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 70 50 61  nPageCount = pPa
35e40 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
35e50 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e   if( pPg->pgno>n
35e60 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
35e70 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d     nPage = (pPg-
35e80 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a  >pgno - pg1)+1;.
35e90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
35ea0 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
35eb0 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
35ec0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
35ed0 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67   nPageCount+1-pg
35ee0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
35ef0 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
35f00 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20  ePerSector;.    
35f10 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61  }.    assert(nPa
35f20 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72  ge>0);.    asser
35f30 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f  t(pg1<=pPg->pgno
35f40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70  );.    assert((p
35f50 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70  g1+nPage)>pPg->p
35f60 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  gno);..    for(i
35f70 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
35f80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
35f90 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e  ii++){.      Pgn
35fa0 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20  o pg = pg1+ii;. 
35fb0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
35fc0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d  e;.      if( pg=
35fd0 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73  =pPg->pgno || !s
35fe0 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
35ff0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
36000 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20  nal, pg) ){.    
36010 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45      if( pg!=PAGE
36020 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
36030 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
36040 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
36050 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20  Get(pPager, pg, 
36060 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
36070 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36080 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36090 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
360a0 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
360b0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
360c0 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
360d0 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
360e0 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53             needS
360f0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
36100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
36110 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
36120 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
36130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36140 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
36150 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65  f( (pPage = page
36160 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
36170 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20   pg))!=0 ){.    
36180 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66      if( pPage->f
36190 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
361a0 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  SYNC ){.        
361b0 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
361c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
361d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
361e0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
361f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
36200 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e  * If the PGHDR_N
36210 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
36220 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20   set for any of 
36230 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  the nPage pages 
36240 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
36250 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74   at pg1, then it
36260 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74   needs to be set
36270 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d   for all of them
36280 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  . Because.    **
36290 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
362a0 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70  of these nPage p
362b0 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20  ages may damage 
362c0 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a  the others, the.
362d0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
362e0 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ile must contain
362f0 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73   sync()ed copies
36300 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a   of all of them.
36310 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e      ** before an
36320 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65  y of them can be
36330 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
36340 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36350 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
36360 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36370 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  && needSync ){. 
36380 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45       assert( !ME
36390 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  MDB );.      for
363a0 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b  (ii=0; ii<nPage;
363b0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
363c0 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70  PgHdr *pPage = p
363d0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
363e0 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20  er, pg1+ii);.   
363f0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29       if( pPage )
36400 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
36410 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  e->flags |= PGHD
36420 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
36430 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
36440 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
36450 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36460 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73   }.    }..    as
36470 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
36480 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20  NotSyncSpill==1 
36490 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
364a0 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b  oNotSyncSpill--;
364b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
364c0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
364d0 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  DbPage);.  }.  r
364e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
364f0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
36500 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
36510 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
36520 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
36530 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
36540 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
36550 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
36560 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
36570 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
36580 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
36590 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
365a0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
365b0 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
365c0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
365d0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
365e0 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73  eturn pPg->flags
365f0 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a  &PGHDR_DIRTY;.}.
36600 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
36610 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
36620 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
36630 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
36640 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
36650 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
36660 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
36670 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68  e pPg back to th
36680 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
36690 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
366a0 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
366b0 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73   as dirty.  This
366c0 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78   happens, for ex
366d0 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74  ample, when.** t
366e0 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
366f0 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66   added as a leaf
36700 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
36710 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63   and so its.** c
36720 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72  ontent no longer
36730 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20   matters..**.** 
36740 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
36750 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
36760 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
36770 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
36780 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
36790 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
367a0 73 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d  sed. The pager m
367b0 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
367c0 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
367d0 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
367e0 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
367f0 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
36800 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
36810 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71  timization can q
36820 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
36830 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20  ed of large .** 
36840 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
36850 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
36860 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
36870 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
36880 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
36890 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
368a0 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
368b0 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70  GHDR_DIRTY) && p
368c0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
368d0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45  t==0 ){.    PAGE
368e0 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52  RTRACE(("DONT_WR
368f0 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
36900 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
36910 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
36920 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  ));.    IOTRACE(
36930 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22  ("CLEAN %p %d\n"
36940 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
36950 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66  gno)).    pPg->f
36960 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f  lags |= PGHDR_DO
36970 4e 54 5f 57 52 49 54 45 3b 0a 20 20 20 20 70 61  NT_WRITE;.    pa
36980 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
36990 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  (pPg);.  }.}../*
369a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
369b0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
369c0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
369d0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
369e0 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67  e file .** chang
369f0 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65  e-counter, store
36a00 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69  d as a 4-byte bi
36a10 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
36a20 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a   starting at .**
36a30 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
36a40 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
36a50 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 61 72  e.  The secondar
36a60 79 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  y change counter
36a70 20 61 74 0a 2a 2a 20 39 32 20 69 73 20 61 6c 73   at.** 92 is als
36a80 6f 20 75 70 64 61 74 65 64 2c 20 61 73 20 69 73  o updated, as is
36a90 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73   the SQLite vers
36aa0 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66  ion number at of
36ab0 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 42  fset 96..**.** B
36ac0 75 74 20 74 68 69 73 20 6f 6e 6c 79 20 68 61 70  ut this only hap
36ad0 70 65 6e 73 20 69 66 20 74 68 65 20 70 50 61 67  pens if the pPag
36ae0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
36af0 6f 6e 65 20 66 6c 61 67 20 69 73 20 66 61 6c 73  one flag is fals
36b00 65 2e 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 65  e..** To avoid e
36b10 78 63 65 73 73 20 63 68 75 72 6e 69 6e 67 20 6f  xcess churning o
36b20 66 20 70 61 67 65 20 31 2c 20 74 68 65 20 75 70  f page 1, the up
36b30 64 61 74 65 20 6f 6e 6c 79 20 68 61 70 70 65 6e  date only happen
36b40 73 20 6f 6e 63 65 2e 0a 2a 2a 20 53 65 65 20 61  s once..** See a
36b50 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 77 72  lso the pager_wr
36b60 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
36b70 72 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61 74  r() routine that
36b80 20 64 6f 65 73 20 61 6e 20 0a 2a 2a 20 75 6e 63   does an .** unc
36b90 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74  onditional updat
36ba0 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 20  e of the change 
36bb0 63 6f 75 6e 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  counters..**.** 
36bc0 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74 4d  If the isDirectM
36bd0 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f  ode flag is zero
36be0 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64  , then this is d
36bf0 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a  one by calling .
36c00 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ** sqlite3PagerW
36c10 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31  rite() on page 1
36c20 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67  , then modifying
36c30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
36c40 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74   the.** page dat
36c50 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  a. In this case 
36c60 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  the file will be
36c70 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68   updated when th
36c80 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61  e current.** tra
36c90 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
36ca0 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  itted..**.** The
36cb0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c   isDirectMode fl
36cc0 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e  ag may only be n
36cd0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c  on-zero if the l
36ce0 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69  ibrary was compi
36cf0 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  led.** with the 
36d00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
36d10 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f  OMIC_WRITE macro
36d20 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69   defined. In thi
36d30 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73  s case,.** if is
36d40 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65  Direct is non-ze
36d50 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ro, then the dat
36d60 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 70  abase file is up
36d70 64 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a  dated directly.*
36d80 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20  * by writing an 
36d90 75 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20  updated version 
36da0 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e 67 20  of page 1 using 
36db0 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a  a call to the .*
36dc0 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  * sqlite3OsWrite
36dd0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
36de0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
36df0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
36e00 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
36e10 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d  r, int isDirectM
36e20 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ode){.  int rc =
36e30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
36e40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
36e50 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
36e60 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
36e70 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
36e80 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
36e90 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
36ea0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
36eb0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
36ec0 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 63  er) );..  /* Dec
36ed0 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  lare and initial
36ee0 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  ize constant int
36ef0 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27 2e  eger 'isDirect'.
36f00 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f   If the.  ** ato
36f10 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
36f20 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  zation is enable
36f30 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c  d in this build,
36f40 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20   then isDirect. 
36f50 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   ** is initializ
36f60 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ed to the value 
36f70 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69 73  passed as the is
36f80 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d  DirectMode param
36f90 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69  eter.  ** to thi
36fa0 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65  s function. Othe
36fb0 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77  rwise, it is alw
36fc0 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  ays set to zero.
36fd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69  .  **.  ** The i
36fe0 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20 74  dea is that if t
36ff0 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
37000 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
37010 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64  not.  ** enabled
37020 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
37030 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  , the compiler c
37040 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74  an omit the test
37050 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72  s of.  ** 'isDir
37060 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77  ect' below, as w
37070 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b  ell as the block
37080 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65   enclosed in the
37090 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72  .  ** "if( isDir
370a0 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e  ect )" condition
370b0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
370c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
370d0 4d 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66 69  MIC_WRITE.# defi
370e0 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 30  ne DIRECT_MODE 0
370f0 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72  .  assert( isDir
37100 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ectMode==0 );.  
37110 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
37120 28 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a  (isDirectMode);.
37130 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44  #else.# define D
37140 49 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 72  IRECT_MODE isDir
37150 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a  ectMode.#endif..
37160 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63    if( !pPager->c
37170 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26  hangeCountDone &
37180 26 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d  & ALWAYS(pPager-
37190 3e 64 62 53 69 7a 65 3e 30 29 20 29 7b 0a 20 20  >dbSize>0) ){.  
371a0 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
371b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371c0 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20  /* Reference to 
371d0 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 20 20 61  page 1 */..    a
371e0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
371f0 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70  tempFile && isOp
37200 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
37210 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70  ;..    /* Open p
37220 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
37230 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
37240 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
37250 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
37260 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a  r, 1, &pPgHdr);.
37270 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 48      assert( pPgH
37280 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  dr==0 || rc==SQL
37290 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f  ITE_OK );..    /
372a0 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61  * If page one wa
372b0 73 20 66 65 74 63 68 65 64 20 73 75 63 63 65 73  s fetched succes
372c0 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73  sfully, and this
372d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
372e0 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  .    ** operatin
372f0 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65  g in direct-mode
37300 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72  , make page 1 wr
37310 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f  itable.  When no
37320 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72  t in .    ** dir
37330 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31  ect mode, page 1
37340 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
37350 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e  in cache and hen
37360 63 65 20 74 68 65 20 50 61 67 65 72 47 65 74 28  ce the PagerGet(
37370 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69  ).    ** above i
37380 73 20 61 6c 77 61 79 73 20 73 75 63 63 65 73 73  s always success
37390 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20  ful - hence the 
373a0 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51  ALWAYS on rc==SQ
373b0 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a  LITE_OK..    */.
373c0 20 20 20 20 69 66 28 20 21 44 49 52 45 43 54 5f      if( !DIRECT_
373d0 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53 28 72  MODE && ALWAYS(r
373e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b  c==SQLITE_OK) ){
373f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
37400 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
37410 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  gHdr);.    }..  
37420 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37430 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
37440 41 63 74 75 61 6c 6c 79 20 64 6f 20 74 68 65 20  Actually do the 
37450 75 70 64 61 74 65 20 6f 66 20 74 68 65 20 63 68  update of the ch
37460 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange counter */.
37470 20 20 20 20 20 20 70 61 67 65 72 5f 77 72 69 74        pager_writ
37480 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
37490 70 50 67 48 64 72 29 3b 0a 0a 20 20 20 20 20 20  pPgHdr);..      
374a0 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e  /* If running in
374b0 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72   direct mode, wr
374c0 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
374d0 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68   of page 1 to th
374e0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  e file. */.     
374f0 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45   if( DIRECT_MODE
37500 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
37510 74 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20  t void *zBuf;.  
37520 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
37530 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
37540 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  >0 );.        CO
37550 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67  DEC2(pPager, pPg
37560 48 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36  Hdr->pData, 1, 6
37570 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
37580 4d 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  M, zBuf);.      
37590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
375a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
375b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
375c0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
375d0 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
375e0 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
375f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
37600 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
37610 57 52 49 54 45 5d 2b 2b 3b 0a 20 20 20 20 20 20  WRITE]++;.      
37620 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
37630 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37640 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
37650 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
37660 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ne = 1;.        
37670 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
37680 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
37690 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
376a0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
376b0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
376c0 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
376d0 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
376e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
376f0 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  PgHdr);.  }.  re
37700 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37710 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
37720 61 73 65 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ase file to disk
37730 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
37740 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  p for in-memory 
37750 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 6f 72 20  databases.** or 
37760 70 61 67 65 73 20 77 69 74 68 20 74 68 65 20 50  pages with the P
37770 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
37780 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73   set..**.** If s
37790 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66  uccessful, or if
377a0 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67   called on a pag
377b0 65 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20  er for which it 
377c0 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73  is a no-op, this
377d0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
377e0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
377f0 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f  Otherwise, an IO
37800 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
37810 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
37820 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
37830 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
37840 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37850 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50  TE_OK;.  if( !pP
37860 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
37870 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
37880 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  DB );.    rc = s
37890 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
378a0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
378b0 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 7d  >syncFlags);.  }
378c0 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 28  else if( isOpen(
378d0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
378e0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
378f0 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  B );.    rc = sq
37900 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
37910 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
37920 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43  QLITE_FCNTL_SYNC
37930 5f 4f 4d 49 54 54 45 44 2c 20 30 29 3b 0a 20 20  _OMITTED, 0);.  
37940 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37950 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20  _NOTFOUND ){.   
37960 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
37970 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
37980 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37990 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
379a0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
379b0 6c 65 64 20 77 68 69 6c 65 20 61 20 77 72 69 74  led while a writ
379c0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
379d0 20 61 63 74 69 76 65 20 69 6e 0a 2a 2a 20 72 6f   active in.** ro
379e0 6c 6c 62 61 63 6b 2e 20 49 66 20 74 68 65 20 63  llback. If the c
379f0 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20  onnection is in 
37a00 57 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  WAL mode, this c
37a10 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  all is a no-op. 
37a20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
37a30 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
37a40 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
37a50 79 20 68 61 76 65 20 61 6e 20 45 58 43 4c 55 53  y have an EXCLUS
37a60 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  IVE lock on .** 
37a70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37a80 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  e, an attempt is
37a90 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
37aa0 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  one..**.** If th
37ab0 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
37ac0 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
37ad0 20 6f 72 20 74 68 65 20 61 74 74 65 6d 70 74 20   or the attempt 
37ae0 74 6f 20 6f 62 74 61 69 6e 20 69 74 20 69 73 0a  to obtain it is.
37af0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  ** successful, o
37b00 72 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  r the connection
37b10 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c   is in WAL mode,
37b20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
37b30 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  turned..** Other
37b40 77 69 73 65 2c 20 65 69 74 68 65 72 20 53 51 4c  wise, either SQL
37b50 49 54 45 5f 42 55 53 59 20 6f 72 20 61 6e 20 53  ITE_BUSY or an S
37b60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
37b70 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
37b80 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  * returned..*/.i
37b90 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 45  nt sqlite3PagerE
37ba0 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 50 61 67  xclusiveLock(Pag
37bb0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
37bc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37bd0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
37be0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37bf0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
37c00 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  OD .       || pP
37c10 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37c20 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
37c30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
37c40 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37c50 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
37c60 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
37c70 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
37c80 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
37c90 69 66 28 20 30 3d 3d 70 61 67 65 72 55 73 65 57  if( 0==pagerUseW
37ca0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
37cb0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
37cc0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
37cd0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
37ce0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
37cf0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
37d00 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
37d10 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
37d20 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
37d30 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
37d40 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
37d50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
37d60 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
37d70 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
37d80 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
37d90 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
37da0 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
37db0 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
37dc0 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
37dd0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
37de0 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
37df0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
37e00 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
37e10 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a  ne ensures that:
37e20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  .**.**   * The d
37e30 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
37e40 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75  nge-counter is u
37e50 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74  pdated,.**   * t
37e60 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
37e70 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65  nced (unless the
37e80 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
37e90 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73  timization is us
37ea0 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20  ed),.**   * all 
37eb0 64 69 72 74 79 20 70 61 67 65 73 20 61 72 65 20  dirty pages are 
37ec0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
37ed0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a  atabase file, .*
37ee0 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
37ef0 73 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  se file is trunc
37f00 61 74 65 64 20 28 69 66 20 72 65 71 75 69 72 65  ated (if require
37f10 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74  d), and.**   * t
37f20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37f30 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   synced. .**.** 
37f40 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
37f50 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63  hat remains to c
37f60 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
37f70 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61  ction is to fina
37f80 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65  lize .** (delete
37f90 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  , truncate or ze
37fa0 72 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 72  ro the first par
37fb0 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61  t of) the journa
37fc0 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64  l file (or .** d
37fd0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
37fe0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
37ff0 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
38000 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
38010 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
38020 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
38030 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
38040 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
38050 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
38060 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
38070 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ne() call..**.**
38080 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61   If the final pa
38090 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63  rameter - noSync
380a0 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e   - is true, then
380b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
380c0 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20  le itself.** is 
380d0 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20  not synced. The 
380e0 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c  caller must call
380f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
38100 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a  c() directly to.
38110 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  ** sync the data
38120 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
38130 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50   calling CommitP
38140 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c  haseTwo() to del
38150 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ete the.** journ
38160 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20  al file in this 
38170 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  case..*/.int sql
38180 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
38190 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72  haseOne(.  Pager
381a0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
381b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
381c0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
381d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
381e0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
381f0 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
38200 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
38210 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  al name */.  int
38220 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20   noSync         
38230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38240 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65  True to omit the
38250 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62   xSync on the db
38260 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
38270 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
38280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
38290 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
382a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
382b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
382c0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
382d0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
382e0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
382f0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
38300 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
38310 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
38320 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
38330 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
38340 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
38350 52 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  R.  );.  assert(
38360 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
38370 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
38380 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20    /* If a prior 
38390 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
383a0 72 65 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f  report that erro
383b0 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66  r again. */.  if
383c0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
383d0 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
383e0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
383f0 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  e;..  PAGERTRACE
38400 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43  (("DATABASE SYNC
38410 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65  : File=%s zMaste
38420 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22  r=%s nSize=%d\n"
38430 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
38440 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
38450 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ter, pPager->dbS
38460 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ize));..  /* If 
38470 6e 6f 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  no database chan
38480 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61  ges have been ma
38490 64 65 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79  de, return early
384a0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
384b0 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
384c0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
384d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
384e0 4f 4b 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42  OK;..  if( MEMDB
384f0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
38500 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
38510 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
38520 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
38530 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
38540 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  .    ** function
38550 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
38560 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
38570 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20  mostly a no-op. 
38580 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20   However, any.  
38590 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70    ** backup in p
385a0 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f  rogress needs to
385b0 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
385c0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
385d0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
385e0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
385f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
38600 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
38610 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 50  ager) ){.      P
38620 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71  gHdr *pList = sq
38630 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
38640 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
38650 61 63 68 65 29 3b 0a 20 20 20 20 20 20 50 67 48  ache);.      PgH
38660 64 72 20 2a 70 50 61 67 65 4f 6e 65 20 3d 20 30  dr *pPageOne = 0
38670 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
38680 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
38690 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 61 74 20  /* Must have at 
386a0 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 20 66  least one page f
386b0 6f 72 20 74 68 65 20 57 41 4c 20 63 6f 6d 6d 69  or the WAL commi
386c0 74 20 66 6c 61 67 2e 0a 20 20 20 20 20 20 20 20  t flag..        
386d0 2a 2a 20 54 69 63 6b 65 74 20