/ Hex Artifact Content
Login

Artifact b6f38fc2f0da8eafe6ccfbf0b12e228b2ce5fb76:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
7c50: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
7c60: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c70: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
7c80: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
7c90: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
7ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7cb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
7cc0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
7cd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
7ce0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
7cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7d00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7d10: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d30: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
7d40: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7d60: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7d80: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
7d90: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
7da0: 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ader */.  sqlite
7db0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
7dc0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
7dd0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
7de0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
7df0: 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53  sses */.  PagerS
7e00: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
7e10: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
7e20: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
7e30: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
7e40: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
7e50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e60: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
7e70: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
7e80: 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e  u32 iDataVersion
7e90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
7ec0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68   changes */.  ch
7ed0: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7ee0: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7ef0: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7f00: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7f10: 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d  ges */..  int nM
7f20: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7f30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f40: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7f50: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7f60: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
7f70: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
7f80: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
7f90: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
7fa0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
7fb0: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
7fc0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7fd0: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7fe0: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7ff0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
8000: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
8010: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
8020: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8080: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8090: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
80a0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
80b0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
80c0: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
80d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
80e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
80f0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
8100: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
8110: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
8120: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
8130: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
8140: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8150: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8160: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8170: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8180: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8190: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
81a0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
81d0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
81e0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8200: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
8210: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8220: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
8230: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
8240: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
8250: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8270: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8280: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
82a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
82b0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
82c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
82d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
82e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
82f0: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
8300: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
8310: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
8320: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
8330: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
8340: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
8350: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8360: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8370: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8390: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
83a0: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
83b0: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
83c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
83d0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
83f0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
8400: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
8410: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8420: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
8430: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
8440: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
8450: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
8460: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
8470: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
8480: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8490: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
84a0: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
84b0: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
84c0: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
84d0: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
84e0: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
84f0: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
8500: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
8510: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
8520: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
8530: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
8540: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
8550: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
8560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8570: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
8580: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8590: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
85a0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
85c0: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
85d0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
85e0: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
85f0: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
8600: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8610: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
8620: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
8630: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8640: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
8670: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
8680: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8690: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
86c0: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
86d0: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
86e0: 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f  /*.** Indexes fo
86f0: 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72  r use with Pager
8700: 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61  .aStat[]. The Pa
8710: 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61  ger.aStat[] arra
8720: 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  y contains.** th
8730: 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65  e values accesse
8740: 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c  d by passing SQL
8750: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
8760: 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49  HE_HIT, CACHE_MI
8770: 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f  SS .** or CACHE_
8780: 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33  WRITE to sqlite3
8790: 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f  _db_status()..*/
87a0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
87b0: 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66  TAT_HIT   0.#def
87c0: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d  ine PAGER_STAT_M
87d0: 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50  ISS  1.#define P
87e0: 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20  AGER_STAT_WRITE 
87f0: 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  2../*.** The fol
8800: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
8810: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
8820: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
8830: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
8840: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
8850: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8860: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8870: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8880: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8890: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
88a0: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
88b0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
88c0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
88d0: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
88e0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
88f0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8900: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8910: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8920: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8930: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8940: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8950: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8960: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8970: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8980: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8990: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
89a0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
89b0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
89c0: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
89d0: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
89e0: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
89f0: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8a00: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8a10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8a20: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8a30: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8a40: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8a50: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8a60: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8a70: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8a80: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8a90: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8aa0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8ab0: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8ac0: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8ae0: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8af0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8b00: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8b10: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8b20: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8b30: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8b40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8b50: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8b60: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8b70: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8b80: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8b90: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8ba0: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8bb0: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8bc0: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8bd0: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8be0: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8bf0: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8c00: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8c10: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8c20: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8c30: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8c40: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8c50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8c60: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8c70: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8c80: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8c90: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
8ca0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
8cb0: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
8cc0: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
8cd0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
8ce0: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
8cf0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
8d00: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
8d10: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
8d20: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
8d30: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
8d40: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
8d50: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
8d60: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
8d70: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
8d80: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
8d90: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
8da0: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
8db0: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
8dc0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
8dd0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
8de0: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
8df0: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
8e00: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
8e10: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
8e20: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
8e30: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
8e40: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
8e50: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
8e60: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
8e70: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
8e80: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
8e90: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
8ea0: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
8eb0: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
8ec0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
8ed0: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
8ee0: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
8ef0: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
8f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8f10: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
8f20: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
8f30: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
8f40: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
8f50: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
8f60: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
8f70: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
8f80: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
8f90: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
8fa0: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
8fb0: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
8fc0: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
8fd0: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
8fe0: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
8ff0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
9000: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
9010: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
9020: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
9030: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
9040: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
9050: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
9060: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
9070: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
9080: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
9090: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
90a0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
90b0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
90c0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
90d0: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
90e0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
90f0: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
9100: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
9110: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
9120: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
9130: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
9140: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
9150: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
9160: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
9170: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
9180: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
9190: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
91a0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
91b0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
91c0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
91d0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
91e0: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
91f0: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
9200: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
9210: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
9220: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
9230: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
9240: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
9250: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
9260: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
9270: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
9280: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
9290: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
92a0: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
92b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
92c0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
92d0: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
92e0: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
92f0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9300: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
9310: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9320: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
9330: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
9340: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
9350: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
9360: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
9370: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
9380: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
9390: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
93a0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
93b0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
93c0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
93d0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
93e0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
93f0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
9400: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
9410: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
9420: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
9430: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
9440: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9450: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
9460: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
9470: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
9480: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
9490: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
94a0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
94b0: 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a  ->pMethods!=0)..
94c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
94d0: 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72 20  e if this pager 
94e0: 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68 65  uses a write-ahe
94f0: 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f  ad log instead o
9500: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72  f the usual.** r
9510: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
9520: 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   Otherwise false
9530: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
9540: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 69 6e 74  ITE_OMIT_WAL.int
9550: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 73 65   sqlite3PagerUse
9560: 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
9570: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  r){.  return (pP
9580: 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a  ager->pWal!=0);.
9590: 7d 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  }.# define pager
95a0: 55 73 65 57 61 6c 28 78 29 20 73 71 6c 69 74 65  UseWal(x) sqlite
95b0: 33 50 61 67 65 72 55 73 65 57 61 6c 28 78 29 0a  3PagerUseWal(x).
95c0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
95d0: 61 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a  agerUseWal(x) 0.
95e0: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f  # define pagerRo
95f0: 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23  llbackWal(x) 0.#
9600: 20 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c   define pagerWal
9610: 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20  Frames(v,w,x,y) 
9620: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
9630: 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
9640: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20  (z) SQLITE_OK.# 
9650: 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69  define pagerBegi
9660: 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
9670: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (z) SQLITE_OK.#e
9680: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44  ndif..#ifndef ND
9690: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67  EBUG ./*.** Usag
96a0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  e:.**.**   asser
96b0: 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
96c0: 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
96d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
96e0: 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61  tion runs many a
96f0: 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f  sserts to try to
9700: 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65   find inconsiste
9710: 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ncies in.** the 
9720: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
9730: 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  f the Pager obje
9740: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
9750: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
9760: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
9770: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
9780: 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65  = p;..  /* State
9790: 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20   must be valid. 
97a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
97b0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
97c0: 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  EN.       || p->
97d0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
97e0: 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70  ADER.       || p
97f0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9800: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
9810: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9820: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9830: 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
9840: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9850: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
9860: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9870: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
9880: 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20  ER_FINISHED.    
9890: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
98a0: 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29  =PAGER_ERROR.  )
98b0: 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65  ;..  /* Regardle
98c0: 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ss of the curren
98d0: 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d  t state, a temp-
98e0: 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  file connection 
98f0: 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20  always behaves. 
9900: 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73   ** as if it has
9910: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
9920: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
9930: 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65  se file. It neve
9940: 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74  r updates.  ** t
9950: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
9960: 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20  r field, so the 
9970: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9980: 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73  flag is always s
9990: 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
99a0: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
99b0: 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  0 || p->eLock==E
99c0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
99d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
99e0: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  mpFile==0 || pPa
99f0: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
9a00: 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Done );..  /* If
9a10: 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20   the useJournal 
9a20: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74  flag is clear, t
9a30: 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
9a40: 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a  must be "OFF". .
9a50: 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20    ** And if the 
9a60: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20  journal-mode is 
9a70: 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e  "OFF", the journ
9a80: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74  al file must not
9a90: 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20   be open..  */. 
9aa0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
9ab0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9ac0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
9ad0: 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  | p->useJournal 
9ae0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9af0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
9b00: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9b10: 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d  FF || !isOpen(p-
9b20: 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  >jfd) );..  /* C
9b30: 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20  heck that MEMDB 
9b40: 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20  implies noSync. 
9b50: 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  And an in-memory
9b60: 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20   journal. Since 
9b70: 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73  .  ** this means
9b80: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9b90: 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20  ger performs no 
9ba0: 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61  IO at all, it ca
9bb0: 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a  nnot encounter .
9bc0: 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49    ** either SQLI
9bd0: 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49  TE_IOERR or SQLI
9be0: 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72  TE_FULL during r
9bf0: 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65  ollback or while
9c00: 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a   finalizing .  *
9c10: 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * a journal file
9c20: 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20  . (although the 
9c30: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9c40: 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  l implementation
9c50: 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72   may .  ** retur
9c60: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
9c70: 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a  OMEM while the j
9c80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
9c90: 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49  eing written). I
9ca0: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65  t .  ** is there
9cb0: 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c  fore not possibl
9cc0: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
9cd0: 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  ry pager to ente
9ce0: 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a  r the ERROR .  *
9cf0: 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  * state..  */.  
9d00: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
9d10: 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
9d20: 28 70 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 61  (p->fd) );.    a
9d30: 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63  ssert( p->noSync
9d40: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9d50: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9d60: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9d70: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
9d80: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
9d90: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9da0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20  MODE_MEMORY .   
9db0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9dc0: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
9dd0: 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65 53 74  _ERROR && p->eSt
9de0: 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
9df0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9e00: 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d 3d 30  agerUseWal(p)==0
9e10: 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
9e20: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
9e30: 20 69 73 20 73 65 74 2c 20 61 20 52 45 53 45 52   is set, a RESER
9e40: 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  VED lock or grea
9e50: 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
9e60: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c  .  ** on the fil
9e70: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
9e80: 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  ( pPager->change
9e90: 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20  CountDone==0 || 
9ea0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52  pPager->eLock>=R
9eb0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
9ec0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9ed0: 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck!=PENDING_LOCK
9ee0: 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
9ef0: 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
9f00: 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a  case PAGER_OPEN:
9f10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
9f20: 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 61  MEMDB );.      a
9f30: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
9f40: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
9f50: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
9f60: 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
9f70: 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
9f80: 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20  >pPCache)==0 || 
9f90: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
9fa0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
9fb0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
9fc0: 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20 20 61  _READER:.      a
9fd0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
9fe0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
9ff0: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a000: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a010: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a020: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a030: 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
a040: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a050: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a060: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a  _WRITER_LOCKED:.
a070: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a080: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
a090: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a0a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a0b0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a0c0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
a0d0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a0e0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  r) ){.        as
a0f0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a100: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
a110: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a120: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a130: 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  bSize==pPager->d
a140: 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20  bOrigSize );.   
a150: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a160: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70  r->dbOrigSize==p
a170: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
a180: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
a190: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
a1a0: 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  gSize==pPager->d
a1b0: 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  bHintSize );.   
a1c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a1d0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20  r->setMaster==0 
a1e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a1f0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a200: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a  WRITER_CACHEMOD:
a210: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a220: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
a230: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a240: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a250: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a260: 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  K );.      if( !
a270: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
a280: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  er) ){.        /
a290: 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  * It is possible
a2a0: 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c   that if journal
a2b0: 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65 20 74  _mode=wal here t
a2c0: 68 61 74 20 6e 65 69 74 68 65 72 20 74 68 65 0a  hat neither the.
a2d0: 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
a2e0: 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68 65 20  al file nor the 
a2f0: 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f 70 65  WAL file are ope
a300: 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  n. This happens 
a310: 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  during.        *
a320: 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61  * a rollback tra
a330: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 77  nsaction that sw
a340: 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72  itches from jour
a350: 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20  nal_mode=off.   
a360: 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e       ** to journ
a370: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20  al_mode=wal..   
a380: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a390: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a3a0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
a3b0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a3c0: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a3d0: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ) .             
a3e0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a3f0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a400: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a410: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a420: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a430: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a440: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
a450: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
a460: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a470: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
a480: 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  FileSize );.    
a490: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a4a0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50  ->dbOrigSize==pP
a4b0: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a4c0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a4d0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a4e0: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20  _WRITER_DBMOD:. 
a4f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a500: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
a510: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a520: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a530: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a540: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a550: 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
a560: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
a570: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a580: 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k>=EXCLUSIVE_LOC
a590: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a5a0: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a5b0: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a5c0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a5d0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a5e0: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a5f0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a600: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a610: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
a620: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
a630: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a640: 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e  igSize<=pPager->
a650: 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20  dbHintSize );.  
a660: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a670: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a680: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20 20 20  R_FINISHED:.    
a690: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a6a0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a6b0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a6c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a6d0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a6e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a6f0: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a700: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a710: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
a720: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
a730: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a740: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a750: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
a760: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a770: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a780: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
a790: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 62        );.      b
a7a0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a7b0: 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20  PAGER_ERROR:.   
a7c0: 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75 73 74     /* There must
a7d0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
a7e0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
a7f0: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
a800: 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ger if.      ** 
a810: 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20  in ERROR state. 
a820: 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 70 61  Otherwise the pa
a830: 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ger should have 
a840: 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65 64 0a  already dropped.
a850: 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f        ** back to
a860: 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 20   OPEN state..   
a870: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
a880: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a890: 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode!=SQLITE_OK )
a8a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a8b0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
a8c0: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
a8d0: 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 50 61 67  Cache)>0 || pPag
a8e0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
a8f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
a900: 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
a910: 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66  #endif /* ifndef
a920: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64   NDEBUG */..#ifd
a930: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
a940: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
a950: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d  pointer to a hum
a960: 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69  an readable stri
a970: 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62  ng in a static b
a980: 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  uffer.** contain
a990: 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66  ing the state of
a9a0: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
a9b0: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
a9c0: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a  rgument. This.**
a9d0: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
a9e0: 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64  be used within d
a9f0: 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78  ebuggers. For ex
aa00: 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74  ample, as an alt
aa10: 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22  ernative.** to "
aa20: 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69  print *pPager" i
aa30: 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64  n gdb:.**.** (gd
aa40: 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20  b) printf "%s", 
aa50: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
aa60: 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61  e(pPager).*/.sta
aa70: 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f  tic char *print_
aa80: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
aa90: 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20  r *p){.  static 
aaa0: 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b  char zRet[1024];
aab0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
aac0: 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c  intf(1024, zRet,
aad0: 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65  .      "Filename
aae0: 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20  :      %s\n".   
aaf0: 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20     "State:      
ab00: 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64     %s errCode=%d
ab10: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a  \n".      "Lock:
ab20: 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a            %s\n".
ab30: 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d        "Locking m
ab40: 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ode:  locking_mo
ab50: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
ab60: 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a  Journal mode:  j
ab70: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e  ournal_mode=%s\n
ab80: 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67  ".      "Backing
ab90: 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65   store: tempFile
aba0: 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65  =%d memDb=%d use
abb0: 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20  Journal=%d\n".  
abc0: 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20      "Journal:   
abd0: 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25      journalOff=%
abe0: 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25  lld journalHdr=%
abf0: 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69  lld\n".      "Si
ac00: 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73  ze:          dbs
ac10: 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a  ize=%d dbOrigSiz
ac20: 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d  e=%d dbFileSize=
ac30: 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d  %d\n".      , p-
ac40: 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20  >zFilename.     
ac50: 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41   , p->eState==PA
ac60: 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20  GER_OPEN        
ac70: 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20      ? "OPEN" :. 
ac80: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ac90: 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20  ==PAGER_READER  
aca0: 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45          ? "READE
acb0: 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  R" :.        p->
acc0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
acd0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20  ITER_LOCKED   ? 
ace0: 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20  "WRITER_LOCKED" 
acf0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
ad00: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
ad10: 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52  R_CACHEMOD ? "WR
ad20: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a  ITER_CACHEMOD" :
ad30: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
ad40: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
ad50: 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49  _DBMOD    ? "WRI
ad60: 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20  TER_DBMOD" :.   
ad70: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
ad80: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
ad90: 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f  ISHED ? "WRITER_
ada0: 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20  FINISHED" :.    
adb0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
adc0: 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20  AGER_ERROR      
add0: 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a       ? "ERROR" :
ade0: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
adf0: 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f   , (int)p->errCo
ae00: 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c  de.      , p->eL
ae10: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20  ock==NO_LOCK    
ae20: 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22       ? "NO_LOCK"
ae30: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
ae40: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
ae50: 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44  CK   ? "RESERVED
ae60: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ae70: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
ae80: 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49  LOCK  ? "EXCLUSI
ae90: 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  VE" :.        p-
aea0: 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
aeb0: 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45  OCK     ? "SHARE
aec0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
aed0: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
aee0: 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57  OCK    ? "UNKNOW
aef0: 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  N" : "?error?". 
af00: 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73       , p->exclus
af10: 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75  iveMode ? "exclu
af20: 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22  sive" : "normal"
af30: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72  .      , p->jour
af40: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
af50: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
af60: 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a  Y   ? "memory" :
af70: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
af80: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
af90: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
afa0: 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20      ? "off" :.  
afb0: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
afc0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
afd0: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
afe0: 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20   ? "delete" :.  
aff0: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
b000: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
b010: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
b020: 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20   ? "persist" :. 
b030: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
b040: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
b050: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
b060: 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a  E ? "truncate" :
b070: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
b080: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
b090: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
b0a0: 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f      ? "wal" : "?
b0b0: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
b0c0: 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65  (int)p->tempFile
b0d0: 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c  , (int)p->memDb,
b0e0: 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72   (int)p->useJour
b0f0: 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a  nal.      , p->j
b100: 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f  ournalOff, p->jo
b110: 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c  urnalHdr.      ,
b120: 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c   (int)p->dbSize,
b130: 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53   (int)p->dbOrigS
b140: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46  ize, (int)p->dbF
b150: 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20  ileSize.  );..  
b160: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
b170: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
b180: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
b190: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
b1a0: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
b1b0: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
b1c0: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
b1d0: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
b1e0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
b1f0: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
b200: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
b210: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
b220: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
b230: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
b240: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
b250: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
b260: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
b270: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
b280: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
b290: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
b2a0: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
b2b0: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
b2c0: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
b2d0: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
b2e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
b2f0: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
b300: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
b310: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
b320: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61  Pg->pPager;.  Pa
b330: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b  gerSavepoint *p;
b340: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
b350: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  Pg->pgno;.  int 
b360: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
b370: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
b380: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  nt; i++){.    p 
b390: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
b3a0: 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  point[i];.    if
b3b0: 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f  ( p->nOrig>=pgno
b3c0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69   && 0==sqlite3Bi
b3d0: 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28  tvecTestNotNull(
b3e0: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
b3f0: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
b400: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
b410: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
b420: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
b430: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
b440: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
b450: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
b460: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
b470: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
b480: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
b490: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b4a0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
b4b0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
b4c0: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
b4d0: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
b4e0: 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66  >pgno);.}.#endif
b4f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
b500: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
b510: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
b520: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
b530: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
b540: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
b550: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
b560: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
b570: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
b580: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
b590: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b5a0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b5b0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
b5c0: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
b5d0: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
b5e0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b5f0: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
b600: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b610: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
b620: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
b630: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
b640: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
b650: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
b660: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
b670: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
b680: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
b690: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
b6a0: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
b6b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b6c0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
b6d0: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
b6e0: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
b6f0: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
b700: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
b710: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
b720: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
b730: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
b740: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
b750: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
b760: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
b770: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b780: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
b790: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
b7a0: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
b7b0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b7c0: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
b7d0: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
b7e0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b7f0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b800: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
b810: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
b820: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
b830: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
b840: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
b850: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
b860: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
b870: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
b880: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
b890: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
b8a0: 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20  r NO_LOCK.** or 
b8b0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67  SHARED_LOCK. Reg
b8c0: 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
b8d0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61  er or not the ca
b8e0: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a  ll to xUnlock().
b8f0: 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74  ** succeeds, set
b900: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
b910: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74   variable to mat
b920: 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65  ch the (attempte
b930: 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a  d) new lock..**.
b940: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
b950: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
b960: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
b970: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
b980: 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ion is.** called
b990: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
b9a0: 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  it. See the comm
b9b0: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
b9c0: 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b  efine of .** UNK
b9d0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
b9e0: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
b9f0: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
ba00: 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  int pagerUnlockD
ba10: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
ba20: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
ba30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ba40: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  K;..  assert( !p
ba50: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
ba60: 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
ba70: 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a  eLock==eLock );.
ba80: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
ba90: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  =NO_LOCK || eLoc
baa0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
bab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
bac0: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61  k!=NO_LOCK || pa
bad0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
bae0: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  )==0 );.  if( is
baf0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
bb00: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bb10: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65  pPager->eLock>=e
bb20: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d  Lock );.    rc =
bb30: 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
bb40: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
bb50: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
bb60: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
bb70: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
bb80: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
bb90: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  _LOCK ){.      p
bba0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
bbb0: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  u8)eLock;.    }.
bbc0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
bbd0: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
bbe0: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
bbf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
bc00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
bc10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
bc20: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
bc30: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
bc40: 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ther SHARED_LOCK
bc50: 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f  ,.** RESERVED_LO
bc60: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
bc70: 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c  LOCK. If the cal
bc80: 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75  ler is successfu
bc90: 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61  l, set the.** Pa
bca0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
bcb0: 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f  le to the new lo
bcc0: 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a  cking state. .**
bcd0: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
bce0: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
bcf0: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
bd00: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
bd10: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c  tion is .** call
bd20: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
bd30: 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20  y it unless the 
bd40: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
bd50: 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e is EXCLUSIVE_L
bd60: 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65  OCK. .** See the
bd70: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
bd80: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e  he #define of UN
bd90: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
bda0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a  n explanation .*
bdb0: 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  * of this..*/.st
bdc0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f  atic int pagerLo
bdd0: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
bde0: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
bdf0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
be00: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
be10: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
be20: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45  OCK || eLock==RE
be30: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
be40: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
be50: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
be60: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63  ager->eLock<eLoc
be70: 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  k || pPager->eLo
be80: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
be90: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
bea0: 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51  ger->noLock ? SQ
beb0: 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
bec0: 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
bed0: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
bee0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
bef0: 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c  K && (pPager->eL
bf00: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
bf10: 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  K||eLock==EXCLUS
bf20: 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  IVE_LOCK) ){.   
bf30: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
bf40: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
bf50: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
bf60: 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
bf70: 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20  ger, eLock)).   
bf80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
bf90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
bfa0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
bfb0: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72  mines whether or
bfc0: 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d   not the atomic-
bfd0: 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
bfe0: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  on.** can be use
bff0: 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  d with this page
c000: 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  r. The optimizat
c010: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
c020: 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74  if:.**.**  (a) t
c030: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c040: 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61  d by OsDeviceCha
c050: 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69  racteristics() i
c060: 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a  ndicates that.**
c070: 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65        a database
c080: 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69   page may be wri
c090: 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c  tten atomically,
c0a0: 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65   and.**  (b) the
c0b0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
c0c0: 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  by OsSectorSize(
c0d0: 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  ) is less than o
c0e0: 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20  r equal.**      
c0f0: 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  to the page size
c100: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69  ..**.** The opti
c110: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f  mization is also
c120: 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20   always enabled 
c130: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
c140: 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e  les. It is.** an
c150: 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74   error to call t
c160: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  his function if 
c170: 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64  pPager is opened
c180: 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   on an in-memory
c190: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  .** database..**
c1a0: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
c1b0: 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
c1c0: 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74  e used, 0 is ret
c1d0: 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e  urned. If it can
c1e0: 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65   be used,.** the
c1f0: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
c200: 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65  rned is the size
c210: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c220: 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  file when it.** 
c230: 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63  contains rollbac
c240: 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74  k data for exact
c250: 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  ly one page..*/.
c260: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c270: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
c280: 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  E.static int jrn
c290: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
c2a0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
c2b0: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
c2c0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
c2d0: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
c2e0: 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20  nt dc;          
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c300: 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61   /* Device chara
c310: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
c320: 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20    int nSector;  
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c340: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
c350: 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ze */.    int sz
c360: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
c370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c380: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20  age size */..   
c390: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
c3a0: 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
c3b0: 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f     dc = sqlite3O
c3c0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
c3d0: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
c3e0: 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20  d);.    nSector 
c3f0: 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  = pPager->sector
c400: 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65  Size;.    szPage
c410: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
c420: 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ize;..    assert
c430: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c440: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
c450: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53  ));.    assert(S
c460: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
c470: 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
c480: 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  ));.    if( 0==(
c490: 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  dc&(SQLITE_IOCAP
c4a0: 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e  _ATOMIC|(szPage>
c4b0: 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e  >8)) || nSector>
c4c0: 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  szPage) ){.     
c4d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
c4e0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a  .  }..  return J
c4f0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
c500: 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
c510: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d  PG_SZ(pPager);.}
c520: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
c530: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 78  jrnlBufferSize(x
c540: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
c550: 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  * If SQLITE_CHEC
c560: 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e  K_PAGES is defin
c570: 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f  ed then we do so
c580: 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  me sanity checki
c590: 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63  ng.** on the cac
c5a0: 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20  he using a hash 
c5b0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
c5c0: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
c5d0: 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67  ing.** and debug
c5e0: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
c5f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
c600: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
c610: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
c620: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
c630: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
c640: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
c650: 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20  er_datahash(int 
c660: 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20  nByte, unsigned 
c670: 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20  char *pData){.  
c680: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
c690: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
c6a0: 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b  ; i<nByte; i++){
c6b0: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
c6c0: 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b  h*1039) + pData[
c6d0: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
c6e0: 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20   hash;.}.static 
c6f0: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
c700: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
c710: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  {.  return pager
c720: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d  _datahash(pPage-
c730: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
c740: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
c750: 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61  r *)pPage->pData
c760: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
c770: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
c780: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
c790: 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65  ){.  pPage->page
c7a0: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
c7b0: 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a  ehash(pPage);.}.
c7c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
c7d0: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
c7e0: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
c7f0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
c800: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c810: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
c820: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
c830: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
c840: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
c850: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
c860: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
c870: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
c880: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
c890: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
c8a0: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
c8b0: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
c8c0: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
c8d0: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
c8e0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
c8f0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
c900: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
c910: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
c920: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
c930: 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  R );.  assert( (
c940: 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
c950: 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e  _DIRTY) || pPg->
c960: 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f  pageHash==pager_
c970: 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b  pagehash(pPg) );
c980: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .}..#else.#defin
c990: 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  e pager_datahash
c9a0: 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65  (X,Y)  0.#define
c9b0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
c9c0: 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  X)  0.#define pa
c9d0: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
c9e0: 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43  (X).#define CHEC
c9f0: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
ca00: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
ca10: 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a  K_PAGES */../*.*
ca20: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
ca30: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
ca40: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
ca50: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
ca60: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75  open..** This fu
ca70: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
ca80: 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72  to read a master
ca90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
caa0: 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  me from the .** 
cab0: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
cac0: 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66  and, if successf
cad0: 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e  ul, copies it in
cae0: 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69  to memory suppli
caf0: 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ed .** by the ca
cb00: 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  ller. See commen
cb10: 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61  ts above writeMa
cb20: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
cb30: 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20  r the format.** 
cb40: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
cb50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cb60: 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20  ile name at the 
cb70: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
cb80: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61   file..**.** zMa
cb90: 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20  ster must point 
cba0: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
cbb0: 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20  t least nMaster 
cbc0: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
cbd0: 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  by.** the caller
cbe0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
cbf0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
cc00: 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e  athname+1 (to en
cc10: 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  sure there is.**
cc20: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
cc30: 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   write the maste
cc40: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e  r journal name).
cc50: 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   If the master j
cc60: 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69  ournal.** name i
cc70: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
cc80: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61   longer than nMa
cc90: 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c  ster bytes (incl
cca0: 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74  uding a.** nul-t
ccb0: 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e  erminator), then
ccc0: 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64   this is handled
ccd0: 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72   as if no master
cce0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a   journal name.**
ccf0: 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e   were present in
cd00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
cd10: 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20  .** If a master 
cd20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
cd30: 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20  e is present at 
cd40: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
cd50: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20  ournal.** file, 
cd60: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
cd70: 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  d into the buffe
cd80: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
cd90: 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75  zMaster. A.** nu
cda0: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
cdb0: 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  e is appended to
cdc0: 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c   the buffer foll
cdd0: 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  owing the master
cde0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
cdf0: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
ce00: 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  it is determined
ce10: 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20   that no master 
ce20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
ce30: 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a  e is present .**
ce40: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73   zMaster[0] is s
ce50: 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
ce60: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
ce70: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
ce80: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
ce90: 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
cea0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e  journal file, an
ceb0: 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72   SQLite.** error
cec0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
ced0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
cee0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
cef0: 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  al(sqlite3_file 
cf00: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d  *pJrnl, char *zM
cf10: 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74  aster, u32 nMast
cf20: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
cf50: 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20   */.  u32 len;  
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79   /* Length in by
cf80: 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  tes of master jo
cf90: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
cfa0: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
cfb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
cfc0: 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tal size in byte
cfd0: 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  s of journal fil
cfe0: 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32  e pJrnl */.  u32
cff0: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
d000: 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68          /* MJ ch
d010: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61  ecksum value rea
d020: 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
d030: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d050: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
d060: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73  counter */.  uns
d070: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
d080: 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66  c[8];   /* A buf
d090: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
d0a0: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
d0b0: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
d0c0: 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  \0';..  if( SQLI
d0d0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
d0e0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
d0f0: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20  Jrnl, &szJ)).   
d100: 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20  || szJ<16.   || 
d110: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d120: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
d130: 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29  l, szJ-16, &len)
d140: 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61  ).   || len>=nMa
d150: 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d  ster .   || len=
d160: 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  =0 .   || SQLITE
d170: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
d180: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
d190: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
d1a0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d1b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
d1c0: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
d1d0: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
d1e0: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
d1f0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
d200: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
d210: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
d220: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
d230: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
d240: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
d250: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
d260: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
d270: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
d280: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
d290: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
d2a0: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
d2b0: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
d2c0: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
d2d0: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
d2e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
d2f0: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
d300: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
d310: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
d320: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
d330: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
d340: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
d350: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
d360: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
d370: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
d380: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
d390: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
d3a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
d3b0: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
d3c0: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
d3d0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
d3e0: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
d3f0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
d400: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
d410: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
d420: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
d430: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
d440: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
d450: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
d460: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
d470: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
d480: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
d490: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
d4a0: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
d4b0: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
d4c0: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
d4d0: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
d4e0: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
d4f0: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
d500: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
d510: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
d520: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
d530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d550: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d570: 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20   0.**   512     
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20    512.**   100  
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
d5c0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d5d0: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
d5e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
d5f0: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
d600: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
d610: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
d620: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
d630: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
d640: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
d650: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
d660: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d670: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
d680: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d690: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
d6a0: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
d6b0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
d6c0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
d6d0: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
d6e0: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
d6f0: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
d700: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
d710: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
d720: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
d730: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
d740: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
d750: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d760: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
d770: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
d780: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
d790: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
d7a0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
d7b0: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
d7c0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
d7d0: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
d7e0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
d7f0: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
d800: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
d810: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
d820: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
d830: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
d840: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
d850: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
d860: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
d870: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
d880: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
d890: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
d8a0: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
d8b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
d8c0: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
d8d0: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
d8e0: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
d8f0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
d900: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
d910: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
d920: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
d930: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
d940: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
d950: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d960: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
d970: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
d980: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
d990: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
d9a0: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
d9b0: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
d9c0: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
d9d0: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
d9e0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
d9f0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
da00: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
da10: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
da20: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
da30: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
da40: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
da50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
da60: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
da70: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
da80: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
da90: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
daa0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
dab0: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
dac0: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
dad0: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
dae0: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
daf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
db00: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
db10: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
db20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
db30: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
db40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
db50: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
db80: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
db90: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
dba0: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
dbb0: 20 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c   !sqlite3Journal
dbc0: 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65  IsInMemory(pPage
dbd0: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
dbe0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
dbf0: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
dc00: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
dc10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
dc20: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
dc30: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
dc40: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
dc50: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
dc60: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
dc70: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
dc80: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
dc90: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dca0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dcb0: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
dcc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
dcd0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
dce0: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
dcf0: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
dd00: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
dd10: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
dd20: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
dd30: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
dd40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dd50: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
dd60: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
dd70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
dd80: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
dd90: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
dda0: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
ddb0: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
ddc0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
ddd0: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
dde0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
ddf0: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
de00: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
de10: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
de20: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
de30: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
de40: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
de50: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
de60: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
de70: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
de80: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
de90: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
dea0: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
deb0: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
dec0: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
ded0: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
dee0: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
def0: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
df00: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
df10: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
df20: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
df30: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
df40: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
df50: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
df60: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
df70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
df80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
df90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
dfa0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
dfb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
dfc0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
dfd0: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
dfe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dff0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
e000: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
e010: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e020: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
e030: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
e040: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
e050: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
e060: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
e070: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
e080: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
e090: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
e0a0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
e0b0: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
e0c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
e0d0: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
e0e0: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
e0f0: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
e100: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
e110: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e120: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
e130: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
e140: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
e150: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
e160: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
e170: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
e180: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
e190: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
e1a0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
e1b0: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
e1c0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
e1d0: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
e1e0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
e1f0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
e200: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
e210: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
e220: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
e230: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
e240: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
e250: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
e260: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
e270: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e280: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
e290: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e2c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
e2d0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
e2e0: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
e2f0: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
e300: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
e310: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
e320: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
e330: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
e340: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
e350: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
e360: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
e370: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e390: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
e3a0: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
e3b0: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3d0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e3e0: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
e3f0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e400: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
e410: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
e420: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
e430: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
e440: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e450: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
e460: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
e470: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
e480: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e490: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
e4a0: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
e4b0: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
e4c0: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
e4d0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e4e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e4f0: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
e500: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
e510: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
e520: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
e530: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
e540: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
e550: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
e560: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
e570: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e580: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
e590: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e5a0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e5b0: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
e5c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
e5d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
e5e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
e5f0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e600: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
e610: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
e620: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
e630: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
e640: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
e650: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e660: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
e670: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
e680: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
e690: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
e6a0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
e6b0: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
e6c0: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
e6d0: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
e6e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
e6f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
e700: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
e710: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
e720: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
e730: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
e740: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
e750: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
e760: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
e770: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
e780: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
e790: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
e7a0: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
e7b0: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
e7c0: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
e7d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
e7e0: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
e7f0: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
e800: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
e810: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e820: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
e830: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
e840: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
e850: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
e860: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
e870: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
e880: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
e890: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
e8a0: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
e8b0: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
e8c0: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
e8d0: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
e8e0: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
e8f0: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
e900: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
e910: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
e920: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
e930: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
e940: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
e950: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
e960: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
e970: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
e980: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e990: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e9a0: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
e9b0: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
e9c0: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
e9d0: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
e9e0: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
e9f0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
ea00: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
ea10: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
ea20: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
ea30: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
ea40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
ea50: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
ea60: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ea70: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
ea80: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
ea90: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
eaa0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
eab0: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
eac0: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
ead0: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
eae0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
eaf0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
eb00: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
eb10: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
eb20: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
eb30: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
eb40: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
eb50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
eb60: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
eb70: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
eb80: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
eb90: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
eba0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
ebb0: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
ebc0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
ebd0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
ebe0: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
ebf0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
ec00: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
ec10: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
ec20: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
ec30: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
ec40: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
ec50: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
ec60: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
ec70: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ec80: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
ec90: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
eca0: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
ecb0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
ecc0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
ecd0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
ece0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ecf0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ed00: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
ed10: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
ed20: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
ed30: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
ed40: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
ed50: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ed60: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
ed70: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
ed80: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
ed90: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
eda0: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
edb0: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
edc0: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
edd0: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
ede0: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
edf0: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
ee00: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
ee10: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
ee20: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
ee30: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
ee40: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
ee50: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
ee60: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
ee70: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
ee80: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ee90: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
eea0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
eeb0: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
eec0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
eed0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
eee0: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
eef0: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
ef00: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
ef10: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
ef20: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
ef30: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
ef40: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
ef50: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
ef60: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
ef70: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
ef80: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
ef90: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
efa0: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
efb0: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
efc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
efd0: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
efe0: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
eff0: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
f000: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
f010: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
f020: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
f030: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
f040: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
f050: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
f060: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
f070: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
f080: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
f090: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
f0a0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
f0b0: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
f0c0: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
f0d0: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
f0e0: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
f0f0: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
f100: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
f110: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
f120: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
f130: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
f140: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
f150: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
f160: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
f170: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
f180: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
f190: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
f1a0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
f1b0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
f1c0: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
f1d0: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
f1e0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
f1f0: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
f200: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
f210: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
f220: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
f230: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
f240: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
f250: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
f260: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
f270: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
f280: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
f290: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
f2a0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
f2b0: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
f2c0: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
f2d0: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
f2e0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
f2f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
f300: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
f310: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f320: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
f330: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
f340: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f350: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
f360: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f370: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
f380: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
f390: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
f3a0: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
f3b0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f3c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
f3d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
f3e0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
f3f0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
f400: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f410: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
f420: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
f430: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
f440: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
f450: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
f460: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
f470: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f480: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f490: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
f4a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f4b0: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
f4c0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
f4d0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
f4e0: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
f4f0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
f500: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
f510: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
f520: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
f530: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
f540: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
f550: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
f560: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
f570: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
f580: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
f590: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
f5a0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
f5b0: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
f5c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
f5d0: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
f5e0: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
f5f0: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
f600: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
f610: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f620: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
f630: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f640: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
f650: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
f660: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f670: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
f680: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
f690: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
f6a0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
f6b0: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
f6c0: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
f6d0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
f6e0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
f6f0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
f700: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f710: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f720: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f730: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
f740: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
f750: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f760: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f770: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
f780: 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
f790: 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
f7a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f7b0: 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
f7c0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
f7d0: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
f7e0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f7f0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f800: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f810: 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
f820: 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f840: 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
f850: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
f860: 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
f870: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
f8a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f8b0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
f8c0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
f8d0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
f8e0: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
f8f0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
f900: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f910: 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
f920: 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
f930: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
f940: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
f950: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
f960: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
f970: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
f980: 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
f990: 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
f9a0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
f9b0: 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
f9c0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
f9d0: 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
f9e0: 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
f9f0: 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
fa00: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
fa10: 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
fa20: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
fa30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
fa40: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
fa50: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
fa60: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
fa70: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
fa80: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
fa90: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
faa0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fab0: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
fac0: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
fad0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
fae0: 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
faf0: 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
fb00: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fb10: 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
fb20: 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
fb30: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
fb40: 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
fb50: 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
fb60: 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
fb70: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
fb80: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
fb90: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
fba0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
fbb0: 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
fbc0: 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
fbd0: 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
fbe0: 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
fbf0: 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
fc00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
fc10: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
fc20: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fc30: 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
fc40: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
fc50: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fc60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
fc70: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
fc80: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
fc90: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
fca0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fcb0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
fcc0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
fcd0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
fce0: 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
fcf0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fd00: 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
fd10: 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
fd20: 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
fd30: 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
fd40: 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
fd50: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
fd60: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
fd70: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
fd80: 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
fd90: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
fda0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
fdb0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fdc0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fdd0: 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
fde0: 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
fdf0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fe00: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fe10: 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
fe20: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fe30: 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
fe40: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fe50: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fe60: 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
fe70: 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
fe80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fe90: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
fea0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
feb0: 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
fec0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fed0: 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
fee0: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fef0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
ff00: 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
ff10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
ff20: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
ff30: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
ff40: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
ff50: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
ff60: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
ff70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
ff80: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
ff90: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
ffa0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
ffb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
ffc0: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
ffd0: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
ffe0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fff0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
10000 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
10010 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
10020 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
10030 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
10040 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
10050 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
10060 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
10070 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
10080 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
10090 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
100a0 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
100b0 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
100c0 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
100d0 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
100e0 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
100f0 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
10100 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
10110 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
10120 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
10130 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
10140 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
10150 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
10160 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
10170 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
10180 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10190 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
101a0 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
101b0 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
101c0 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
101d0 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
101e0 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
101f0 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
10200 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
10210 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
10220 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
10230 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
10240 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
10250 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
10260 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
10270 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
10280 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
10290 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
102a0 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
102b0 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
102c0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
102d0 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
102e0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
102f0 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
10300 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
10310 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
10320 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
10330 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
10340 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
10350 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
10360 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
10370 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
10380 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
10390 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
103a0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
103b0 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
103c0 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
103d0 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
103e0 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
103f0 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
10400 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
10410 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
10420 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
10430 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10440 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
10450 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10460 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
10470 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10480 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
10490 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
104a0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
104b0 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
104c0 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
104d0 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
104e0 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
104f0 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
10500 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
10510 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
10520 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
10530 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
10540 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
10550 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
10560 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
10570 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10580 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
10590 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
105a0 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
105b0 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
105c0 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
105d0 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
105e0 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
105f0 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
10600 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
10610 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10620 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
10630 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
10640 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
10650 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
10660 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
10670 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
10680 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
10690 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
106a0 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
106b0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
106c0 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
106d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
106e0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
106f0 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
10700 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
10710 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
10720 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10730 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
10740 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
10750 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
10760 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10770 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
10780 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
10790 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
107a0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
107b0 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
107c0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
107d0 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
107e0 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
107f0 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
10800 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
10810 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
10820 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
10830 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
10840 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
10850 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
10860 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
10870 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
10880 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
10890 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
108a0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
108b0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
108c0 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
108d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
108e0 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
108f0 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
10900 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
10910 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10920 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
10930 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
10940 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
10950 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10960 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
10970 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
10980 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
10990 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
109a0 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
109b0 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
109c0 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
109d0 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
109e0 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
109f0 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
10a00 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
10a10 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
10a20 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
10a30 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
10a40 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
10a50 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
10a60 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
10a70 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
10a80 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
10a90 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
10aa0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
10ab0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
10ac0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
10ad0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10af0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10b00 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
10b10 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
10b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10b30 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
10b40 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
10b50 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b70 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
10b80 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
10b90 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
10ba0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
10bb0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10bc0 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
10bd0 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
10be0 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10c00 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
10c10 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
10c20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10c30 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
10c40 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
10c50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
10c60 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
10c70 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
10c80 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
10c90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10ca0 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
10cb0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
10cc0 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
10cd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10ce0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10cf0 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10d00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10d10 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
10d20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10d30 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
10d40 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
10d50 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
10d60 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
10d70 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
10d80 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
10d90 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
10da0 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
10db0 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
10dc0 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
10dd0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10de0 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
10df0 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
10e00 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
10e10 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
10e20 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
10e30 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
10e40 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
10e50 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
10e60 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
10e70 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10e80 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
10e90 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
10ea0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
10eb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10ec0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10ed0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10ee0 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10ef0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10f00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
10f10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
10f20 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
10f30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10f40 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
10f50 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10f60 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
10f70 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
10f80 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
10f90 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10fa0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10fb0 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
10fc0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
10fd0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10fe0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10ff0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
11000 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
11010 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
11020 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
11030 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
11040 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
11050 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
11060 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
11070 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
11080 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
11090 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
110a0 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
110b0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
110c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
110d0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
110e0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
110f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11110 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73    iHdrOff+4+nMas
11120 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
11130 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11140 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
11150 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
11160 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
11170 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11180 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
11190 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
111a0 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
111b0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
111c0 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
111d0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
111e0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
111f0 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
11200 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
11210 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
11220 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
11230 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
11240 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
11250 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
11260 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
11270 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
11280 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
11290 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
112a0 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
112b0 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
112c0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
112d0 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
112e0 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
112f0 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
11300 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
11310 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
11320 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
11330 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
11340 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
11350 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
11360 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
11370 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
11380 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
11390 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
113a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
113b0 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
113c0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
113d0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
113e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
113f0 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
11400 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
11410 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
11420 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
11430 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
11440 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
11450 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
11460 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
11470 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61  ){.  pPager->iDa
11480 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73  taVersion++;.  s
11490 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
114a0 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
114b0 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
114c0 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
114d0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
114e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
114f0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11500 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75  rsion value.*/.u
11510 33 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  32 sqlite3PagerD
11520 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72  ataVersion(Pager
11530 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
11540 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11550 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29  ate>PAGER_OPEN )
11560 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
11570 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 3b  r->iDataVersion;
11580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11590 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
115a0 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
115b0 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
115c0 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
115d0 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
115e0 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
115f0 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
11600 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
11610 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
11620 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
11630 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11640 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
11650 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11660 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11670 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11680 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11690 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
116a0 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
116b0 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
116c0 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
116d0 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
116e0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
116f0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11700 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
11710 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11720 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
11730 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
11740 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
11750 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
11760 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
11770 79 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  y(pPager->sjfd) 
11780 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
11790 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a  Close(pPager->sj
117a0 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
117b0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
117c0 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70  aSavepoint);.  p
117d0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
117e0 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
117f0 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >nSavepoint = 0;
11800 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  .  pPager->nSubR
11810 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ec = 0;.}../*.**
11820 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d   Set the bit num
11830 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ber pgno in the 
11840 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
11850 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  InSavepoint .** 
11860 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f  bitvecs of all o
11870 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
11880 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
11890 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a   if successful.*
118a0 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
118b0 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
118c0 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f  ilure occurs..*/
118d0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54  .static int addT
118e0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
118f0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  s(Pager *pPager,
11900 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
11910 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11920 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
11930 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
11940 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11950 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
11960 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72  t code */..  for
11970 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
11980 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
11990 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
119a0 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
119b0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
119c0 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67  [ii];.    if( pg
119d0 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a  no<=p->nOrig ){.
119e0 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69        rc |= sqli
119f0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e  te3BitvecSet(p->
11a00 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
11a10 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  no);.      testc
11a20 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
11a30 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61  NOMEM );.      a
11a40 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
11a50 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
11a60 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
11a70 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
11a80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
11a90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
11aa0 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
11ab0 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11ac0 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a  e mode and not.*
11ad0 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  * in the ERROR s
11ae0 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
11af0 20 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65   it switches the
11b00 20 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f   pager to PAGER_
11b10 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a  OPEN.** state..*
11b20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
11b30 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11b40 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
11b50 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e, the database 
11b60 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c  file is.** compl
11b70 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  etely unlocked. 
11b80 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
11b90 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  nlocked and the 
11ba0 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73  file-system does
11bb0 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20  .** not exhibit 
11bc0 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f  the UNDELETABLE_
11bd0 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72  WHEN_OPEN proper
11be0 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ty, the journal 
11bf0 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  file is.** close
11c00 64 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e  d (if it is open
11c10 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
11c20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f  pager is in ERRO
11c30 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  R state when thi
11c40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
11c50 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f  lled, the .** co
11c60 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
11c70 67 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69  ger cache are di
11c80 73 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73  scarded before s
11c90 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f  witching back to
11ca0 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74   .** the OPEN st
11cb0 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20  ate. Regardless 
11cc0 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70  of whether the p
11cd0 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
11ce0 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20  sive-mode.** or 
11cf0 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c  not, any journal
11d00 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68   file left in th
11d10 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69  e file-system wi
11d20 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a  ll be treated.**
11d30 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
11d40 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
11d50 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  k the next time 
11d60 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
11d70 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20  on.** is opened 
11d80 28 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61  (by this or by a
11d90 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ny other connect
11da0 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ion)..*/.static 
11db0 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
11dc0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
11dd0 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
11de0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11df0 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20  ER_READER .     
11e00 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
11e10 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
11e20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
11e30 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11e40 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20  _ERROR .  );..  
11e50 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
11e60 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
11e70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
11e80 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
11e90 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c   0;.  releaseAll
11ea0 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
11eb0 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72  r);..  if( pager
11ec0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
11ed0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
11ee0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
11ef0 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  d) );.    sqlite
11f00 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
11f10 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
11f20 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Wal);.    pPager
11f30 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
11f40 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  _OPEN;.  }else i
11f50 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11f60 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
11f70 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f90 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74  * Error code ret
11fa0 75 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e  urned by pagerUn
11fb0 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20  lockDb() */.    
11fc0 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e  int iDc = isOpen
11fd0 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c  (pPager->fd)?sql
11fe0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
11ff0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
12000 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20  er->fd):0;..    
12010 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  /* If the operat
12020 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ing system suppo
12030 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f  rt deletion of o
12040 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a  pen files, then.
12050 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65      ** close the
12060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
12070 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
12080 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20  database lock.  
12090 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
120a0 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
120b0 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
120c0 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
120d0 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ht delete the fi
120e0 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72  le.    ** out fr
120f0 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
12100 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12110 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12120 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29  DE_MEMORY   & 5)
12130 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
12140 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12150 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26  LMODE_OFF      &
12160 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
12170 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12180 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
12190 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
121a0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
121b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
121c0 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  TE   & 5)!=1 );.
121d0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
121e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
121f0 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20  RUNCATE & 5)==1 
12200 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
12210 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12220 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d  E_PERSIST  & 5)=
12230 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  =1 );.    if( 0=
12240 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49  =(iDc & SQLITE_I
12250 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
12260 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20  _WHEN_OPEN).    
12270 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e   || 1!=(pPager->
12280 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29  journalMode & 5)
12290 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
122a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
122b0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
122c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
122d0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
122e0 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20  ERROR state and 
122f0 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f  the call to unlo
12300 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ck the database.
12310 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c      ** file fail
12320 73 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65  s, set the curre
12330 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f  nt lock to UNKNO
12340 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65  WN_LOCK. See the
12350 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20   comment.    ** 
12360 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
12370 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  e for UNKNOWN_LO
12380 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
12390 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69  ation of why thi
123a0 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65  s.    ** is nece
123b0 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
123c0 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f    rc = pagerUnlo
123d0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f  ckDb(pPager, NO_
123e0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
123f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
12400 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
12410 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20  PAGER_ERROR ){. 
12420 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
12430 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ck = UNKNOWN_LOC
12440 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
12450 20 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65   The pager state
12460 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20   may be changed 
12470 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52  from PAGER_ERROR
12480 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68   to PAGER_OPEN h
12490 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f  ere.    ** witho
124a0 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  ut clearing the 
124b0 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73  error code. This
124c0 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20   is intentional 
124d0 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  - the error.    
124e0 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72  ** code is clear
124f0 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  ed and the cache
12500 20 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c   reset in the bl
12510 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  ock below..    *
12520 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
12530 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
12540 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
12550 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
12560 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
12570 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
12580 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
12590 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
125a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50  ;.  }..  /* If P
125b0 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20  ager.errCode is 
125c0 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  set, the content
125d0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
125e0 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20  ache cannot be. 
125f0 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77   ** trusted. Now
12600 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
12610 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
12620 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
12630 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20   pager,.  ** it 
12640 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20  can safely move 
12650 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50  back to PAGER_OP
12660 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68  EN state. This h
12670 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20  appens in both. 
12680 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65   ** normal and e
12690 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67  xclusive-locking
126a0 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   mode..  */.  as
126b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
126c0 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
126d0 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
126e0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
126f0 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ode ){.    if( p
12700 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
12710 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  =0 ){.      page
12720 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
12730 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63  .      pPager->c
12740 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
12750 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
12760 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
12770 5f 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65  _OPEN;.    }else
12780 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
12790 65 53 74 61 74 65 20 3d 20 28 69 73 4f 70 65 6e  eState = (isOpen
127a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 3f 20  (pPager->jfd) ? 
127b0 50 41 47 45 52 5f 4f 50 45 4e 20 3a 20 50 41 47  PAGER_OPEN : PAG
127c0 45 52 5f 52 45 41 44 45 52 29 3b 0a 20 20 20 20  ER_READER);.    
127d0 7d 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54  }.    if( USEFET
127e0 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c  CH(pPager) ) sql
127f0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
12800 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
12810 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
12820 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
12830 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
12840 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
12850 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
12860 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61  alHdr = 0;.  pPa
12870 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
12880 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
12890 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
128a0 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e  lled whenever an
128b0 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65   IOERR or FULL e
128c0 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72  rror that requir
128d0 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  es.** the pager 
128e0 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e  to transition in
128f0 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
12900 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75  te may ahve occu
12910 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72  rred..** The fir
12920 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
12930 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12940 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
12950 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
12960 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
12970 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
12980 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
12990 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  PI function. The
129a0 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72   .** value retur
129b0 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
129c0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
129d0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
129e0 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
129f0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12a00 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46  ment is SQLITE_F
12a10 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
12a20 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a  R or one of the.
12a30 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64  ** IOERR sub-cod
12a40 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e  es, the pager en
12a50 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73  ters the ERROR s
12a60 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72  tate and the err
12a70 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74  or code.** is st
12a80 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72  ored in Pager.er
12a90 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65  rCode. While the
12aa0 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69   pager remains i
12ab0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
12ac0 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20  e,.** all major 
12ad0 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65  API calls on the
12ae0 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
12af0 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50  diately return P
12b00 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a  ager.errCode..**
12b10 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74  .** The ERROR st
12b20 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ate indicates th
12b30 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
12b40 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
12b50 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
12b60 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
12b70 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
12b80 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
12b90 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
12ba0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12bb0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
12bc0 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
12bd0 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
12be0 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
12bf0 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
12c00 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
12c10 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
12c20 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
12c30 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73   replayed to res
12c40 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  tore the content
12c50 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
12c60 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a  e file (as if.**
12c70 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a   it were a hot-j
12c80 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74  ournal)..*/.stat
12c90 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
12ca0 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
12cb0 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
12cc0 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
12cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
12ce0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
12cf0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
12d00 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12d10 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12d20 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
12d30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
12d40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
12d50 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
12d60 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
12d70 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
12d80 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
12d90 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53  E_FULL || rc2==S
12da0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
12db0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
12dc0 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61  de = rc;.    pPa
12dd0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12de0 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  GER_ERROR;.  }. 
12df0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
12e00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12e10 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
12e20 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
12e30 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ge);../*.** The 
12e40 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
12e50 6e 20 6f 70 65 6e 20 6f 6e 20 70 50 61 67 65 72  n open on pPager
12e60 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
12e70 74 65 64 20 28 62 43 6f 6d 6d 69 74 3d 3d 31 29  ted (bCommit==1)
12e80 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  .** or rolled ba
12e90 63 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d 30 29 2e  ck (bCommit==0).
12ea0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  .**.** Return TR
12eb0 55 45 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  UE if and only i
12ec0 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  f all dirty page
12ed0 73 20 73 68 6f 75 6c 64 20 62 65 20 66 6c 75 73  s should be flus
12ee0 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  hed to disk..**.
12ef0 2a 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ** Rules:.**.** 
12f00 20 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d 54 45 4d    *  For non-TEM
12f10 50 20 64 61 74 61 62 61 73 65 73 2c 20 61 6c 77  P databases, alw
12f20 61 79 73 20 73 79 6e 63 20 74 6f 20 64 69 73 6b  ays sync to disk
12f30 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
12f40 73 61 72 79 0a 2a 2a 20 20 20 20 20 20 66 6f 72  sary.**      for
12f50 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 74 6f   transactions to
12f60 20 62 65 20 64 75 72 61 62 6c 65 2e 0a 2a 2a 0a   be durable..**.
12f70 2a 2a 20 20 20 2a 20 20 53 79 6e 63 20 54 45 4d  **   *  Sync TEM
12f80 50 20 64 61 74 61 62 61 73 65 20 6f 6e 6c 79 20  P database only 
12f90 6f 6e 20 61 20 43 4f 4d 4d 49 54 20 28 6e 6f 74  on a COMMIT (not
12fa0 20 61 20 52 4f 4c 4c 42 41 43 4b 29 20 77 68 65   a ROLLBACK) whe
12fb0 6e 20 74 68 65 20 62 61 63 6b 69 6e 67 0a 2a 2a  n the backing.**
12fc0 20 20 20 20 20 20 66 69 6c 65 20 68 61 73 20 62        file has b
12fd0 65 65 6e 20 63 72 65 61 74 65 64 20 61 6c 72 65  een created alre
12fe0 61 64 79 20 28 76 69 61 20 61 20 73 70 69 6c 6c  ady (via a spill
12ff0 20 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28   on pagerStress(
13000 29 29 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 77  )) and.**      w
13010 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
13020 66 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  f dirty pages in
13030 20 6d 65 6d 6f 72 79 20 65 78 63 65 65 64 73 20   memory exceeds 
13040 32 35 25 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  25% of the total
13050 0a 2a 2a 20 20 20 20 20 20 63 61 63 68 65 20 73  .**      cache s
13060 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
13070 6e 74 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43  nt pagerFlushOnC
13080 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
13090 67 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  ger, int bCommit
130a0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
130b0 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72  >tempFile==0 ) r
130c0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21  eturn 1;.  if( !
130d0 62 43 6f 6d 6d 69 74 20 29 20 72 65 74 75 72 6e  bCommit ) return
130e0 20 30 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65   0;.  if( !isOpe
130f0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20  n(pPager->fd) ) 
13100 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
13110 72 6e 20 28 73 71 6c 69 74 65 33 50 43 61 63 68  rn (sqlite3PCach
13120 65 50 65 72 63 65 6e 74 44 69 72 74 79 28 70 50  ePercentDirty(pP
13130 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 3d  ager->pPCache)>=
13140 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  25);.}../*.** Th
13150 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20  is routine ends 
13160 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  a transaction. A
13170 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
13180 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79  usually ended by
13190 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f   .** either a CO
131a0 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41  MMIT or a ROLLBA
131b0 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  CK operation. Th
131c0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62  is routine may b
131d0 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74  e called .** aft
131e0 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61  er rollback of a
131f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72   hot-journal, or
13200 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
13210 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e  urs while openin
13220 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g.** the journal
13230 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67   file or writing
13240 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20   the very first 
13250 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f  journal-header o
13260 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  f a.** database 
13270 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
13280 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13290 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
132a0 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
132b0 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73 20  state. If it is 
132c0 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47  called.** in PAG
132d0 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52  ER_NONE or PAGER
132e0 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61 6e  _SHARED state an
132f0 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20  d the lock held 
13300 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75  is less.** exclu
13310 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53 45  sive than a RESE
13320 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73  RVED lock, it is
13330 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
13340 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61  Otherwise, any a
13350 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
13360 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a   are released..*
13370 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
13380 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
13390 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69  , then it is "fi
133a0 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61  nalized". Once a
133b0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c   journal .** fil
133c0 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c  e has been final
133d0 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70  ized it is not p
133e0 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69  ossible to use i
133f0 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61  t to roll back a
13400 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
13410 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65  . Nor will it be
13420 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
13430 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  e a hot-journal 
13440 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e  by this.** or an
13450 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  y other database
13460 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61   connection. Exa
13470 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e  ctly how a journ
13480 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a  al is finalized.
13490 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  ** depends on wh
134a0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
134b0 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
134c0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
134d0 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ode and.** the c
134e0 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d  urrent journal-m
134f0 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e  ode (Pager.journ
13500 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61  alMode value), a
13510 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
13520 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13530 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f  MEMORY.**     Jo
13540 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
13550 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20  iptor is simply 
13560 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73  closed. This des
13570 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20  troys an .**    
13580 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
13590 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  al..**.**   jour
135a0 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54  nalMode==TRUNCAT
135b0 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  E.**     Journal
135c0 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
135d0 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
135e0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
135f0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
13600 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68  ERSIST.**     Th
13610 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73  e first 28 bytes
13620 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13630 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  file are zeroed.
13640 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65   This invalidate
13650 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72  s.**     the fir
13660 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
13670 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61  r in the file, a
13680 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74  nd hence the ent
13690 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ire journal.**  
136a0 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61     file. An inva
136b0 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lid journal file
136c0 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
136d0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
136e0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c  journalMode==DEL
136f0 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a  ETE.**     The j
13700 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
13710 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13720 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  d using sqlite3O
13730 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
13740 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65       If the page
13750 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
13760 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
13770 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66  this method of f
13780 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20  inalizing.**    
13790 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
137a0 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e  e is never used.
137b0 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65   Instead, if the
137c0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a   journalMode is.
137d0 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e  **     DELETE an
137e0 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  d the pager is i
137f0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
13800 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73  , the method des
13810 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20  cribed under.** 
13820 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d      journalMode=
13830 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64  =PERSIST is used
13840 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
13850 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
13860 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20  l is finalized, 
13870 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20  the pager moves 
13880 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
13890 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e  state..** If run
138a0 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c  ning in non-excl
138b0 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  usive rollback m
138c0 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  ode, the lock on
138d0 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a   the file is .**
138e0 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
138f0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
13900 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
13910 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
13920 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66  error occurs. If
13930 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
13940 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f   during.** any o
13950 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69  f the IO operati
13960 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ons to finalize 
13970 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13980 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a   or unlock the.*
13990 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20  * database then 
139a0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
139b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
139c0 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68   the user. If th
139d0 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  e .** operation 
139e0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
139f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
13a00 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64  ls, then the cod
13a10 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73  e still.** tries
13a20 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
13a30 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
13a40 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
13a50 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a   mode. If the.**
13a60 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
13a70 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c  n fails as well,
13a80 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
13a90 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74  error code relat
13aa0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  ed.** to the fir
13ab0 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74  st error encount
13ac0 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61  ered (the journa
13ad0 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
13ae0 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ne) is.** return
13af0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
13b00 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  t pager_end_tran
13b10 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
13b20 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61  Pager, int hasMa
13b30 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  ster, int bCommi
13b40 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
13b50 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
13b60 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
13b70 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  m journal finali
13b80 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  zation operation
13b90 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20   */.  int rc2 = 
13ba0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
13bb0 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
13bc0 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b  m db file unlock
13bd0 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
13be0 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69   /* Do nothing i
13bf0 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  f the pager does
13c00 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65   not have an ope
13c10 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
13c20 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c  ion.  ** or at l
13c30 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
13c40 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74  lock. This funct
13c50 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
13c60 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a  d when there.  *
13c70 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  * is no write-tr
13c80 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
13c90 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44 20   but a RESERVED 
13ca0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
13cb0 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64  is.  ** held und
13cc0 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  er two circumsta
13cd0 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nces:.  **.  ** 
13ce0 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75 63    1. After a suc
13cf0 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72  cessful hot-jour
13d00 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  nal rollback, it
13d10 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a   is called with.
13d20 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65    **      eState
13d30 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64  ==PAGER_NONE and
13d40 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
13d50 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a  E_LOCK..  **.  *
13d60 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e  *   2. If a conn
13d70 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b  ection with lock
13d80 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
13d90 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  ve holding an EX
13da0 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20  CLUSIVE .  **   
13db0 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73     lock switches
13dc0 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67   back to locking
13dd0 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64  _mode=normal and
13de0 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20 61   then executes a
13df0 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d  .  **      read-
13e00 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69  transaction, thi
13e10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
13e20 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74 65  lled with eState
13e30 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
13e40 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c    **      and eL
13e50 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13e60 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61  OCK when the rea
13e70 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
13e80 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20   closed..  */.  
13e90 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
13ea0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
13eb0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
13ec0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
13ed0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
13ee0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
13ef0 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52  ate<PAGER_WRITER
13f00 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65  _LOCKED && pPage
13f10 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45  r->eLock<RESERVE
13f20 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
13f30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13f40 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c    }..  releaseAl
13f50 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
13f60 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  er);.  assert( i
13f70 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
13f80 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
13f90 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
13fa0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
13fb0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
13fc0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
13fd0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
13fe0 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
13ff0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
14000 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  e. */.    if( sq
14010 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
14020 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a  Memory(pPager->j
14030 66 64 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  fd) ){.      /* 
14040 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14050 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14060 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
14070 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20 20 20 20  EMORY ); */.    
14080 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
14090 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
140a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
140b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
140c0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
140d0 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  ODE_TRUNCATE ){.
140e0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
140f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
14100 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14110 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
14120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14130 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
14140 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
14150 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
14160 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14170 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75 6c  K && pPager->ful
14180 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
14190 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
141a0 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73 69 7a  the new file siz
141b0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
141c0 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69 67 68  o the inode righ
141d0 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20 20 20  t away..        
141e0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 74    ** Otherwise t
141f0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
14200 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c 6c 6f   resurrect follo
14210 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f 73  wing a power los
14220 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  s and.          
14230 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c 61 73  ** cause the las
14240 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  t transaction to
14250 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65 65   roll back.  See
14260 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 74  .          ** ht
14270 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d  tps://bugzilla.m
14280 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f  ozilla.org/show_
14290 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37 32 37  bug.cgi?id=10727
142a0 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  73.          */.
142b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
142c0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
142d0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
142e0 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
142f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14300 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14310 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
14320 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
14330 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
14340 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
14350 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
14360 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
14370 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
14380 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14390 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
143a0 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b  MODE_WAL).    ){
143b0 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
143c0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
143d0 72 2c 20 68 61 73 4d 61 73 74 65 72 7c 7c 70 50  r, hasMaster||pP
143e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
143f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
14400 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
14410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14420 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
14430 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
14440 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
14450 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
14460 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
14470 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
14480 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
14490 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
144a0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
144b0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
144c0 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
144d0 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
144e0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
144f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
14500 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
14510 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
14520 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
14530 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rnal..      */. 
14540 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65       int bDelete
14550 20 3d 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70   = !pPager->temp
14560 46 69 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65  File;.      asse
14570 72 74 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  rt( sqlite3Journ
14580 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
14590 67 65 72 2d 3e 6a 66 64 29 3d 3d 30 20 29 3b 0a  ger->jfd)==0 );.
145a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
145b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
145c0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
145d0 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20  MODE_DELETE .   
145e0 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65          || pPage
145f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
14600 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14610 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20  E_MEMORY .      
14620 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
14630 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14640 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
14650 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
14660 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
14670 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
14680 20 20 20 20 20 20 69 66 28 20 62 44 65 6c 65 74        if( bDelet
14690 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
146a0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
146b0 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
146c0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
146d0 2c 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53  , pPager->extraS
146e0 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ync);.      }.  
146f0 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
14700 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
14710 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ES.  sqlite3Pcac
14720 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
14730 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
14740 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
14750 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  sh);.  if( pPage
14760 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20  r->dbSize==0 && 
14770 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
14780 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
14790 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20  Cache)>0 ){.    
147a0 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74  PgHdr *p = sqlit
147b0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
147c0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66  ager, 1);.    if
147d0 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ( p ){.      p->
147e0 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20  pageHash = 0;.  
147f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14800 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b  UnrefNotNull(p);
14810 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
14820 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  f..  sqlite3Bitv
14830 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
14840 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
14850 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
14860 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  nal = 0;.  pPage
14870 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
14880 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14890 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65   ){.    if( page
148a0 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 70  rFlushOnCommit(p
148b0 50 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74 29 20  Pager, bCommit) 
148c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
148d0 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
148e0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
148f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14900 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
14910 6c 65 61 72 57 72 69 74 61 62 6c 65 28 70 50 61  learWritable(pPa
14920 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
14930 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14940 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
14950 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
14960 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
14970 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65  .  }..  if( page
14980 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
14990 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  ){.    /* Drop t
149a0 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63  he WAL write-loc
149b0 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c  k, if any. Also,
149c0 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
149d0 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a  on was in .    *
149e0 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  * locking_mode=e
149f0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75  xclusive mode bu
14a00 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20  t is no longer, 
14a10 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49  drop the EXCLUSI
14a20 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  VE .    ** lock 
14a30 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
14a40 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
14a50 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  /.    rc2 = sqli
14a60 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72  te3WalEndWriteTr
14a70 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
14a80 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73  ->pWal);.    ass
14a90 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45  ert( rc2==SQLITE
14aa0 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  _OK );.  }else i
14ab0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14ac0 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 70   && bCommit && p
14ad0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
14ae0 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e>pPager->dbSize
14af0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
14b00 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
14b10 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20  when committing 
14b20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
14b30 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
14b40 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66  l.    ** mode if
14b50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14b60 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61  le on disk is la
14b70 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61  rger than the da
14b80 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20  tabase image..  
14b90 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69    ** At this poi
14ba0 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  nt the journal h
14bb0 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
14bc0 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  d and the transa
14bd0 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75  ction .    ** su
14be0 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69  ccessfully commi
14bf0 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45 58  tted, but the EX
14c00 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
14c10 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
14c20 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53  e.    ** file. S
14c30 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  o it is safe to 
14c40 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
14c50 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69 74  abase file to it
14c60 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a  s minimum.    **
14c70 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 20   required size. 
14c80 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
14c90 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
14ca0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
14cb0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
14cc0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
14cd0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
14ce0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
14cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
14d00 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65 6e 28  ommit && isOpen(
14d10 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
14d20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14d30 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
14d40 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
14d50 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41  FCNTL_COMMIT_PHA
14d60 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20 69  SETWO, 0);.    i
14d70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
14d80 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51  TFOUND ) rc = SQ
14d90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
14da0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
14db0 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26  lusiveMode .   &
14dc0 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c 28  & (!pagerUseWal(
14dd0 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74  pPager) || sqlit
14de0 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
14df0 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
14e00 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63   0)).  ){.    rc
14e10 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  2 = pagerUnlockD
14e20 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
14e30 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
14e40 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
14e50 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  one = 0;.  }.  p
14e60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
14e70 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
14e80 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
14e90 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  r = 0;..  return
14ea0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
14eb0 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
14ec0 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c  * Execute a roll
14ed0 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61  back if a transa
14ee0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
14ef0 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
14f00 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
14f10 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
14f20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
14f30 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52  y entered the ER
14f40 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f  ROR state, do no
14f50 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68  t attempt .** th
14f60 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68  e rollback at th
14f70 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64  is time. Instead
14f80 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  , pager_unlock()
14f90 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a   is called. The.
14fa0 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
14fb0 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64  _unlock() will d
14fc0 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65  iscard all in-me
14fd0 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f  mory pages, unlo
14fe0 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ck.** the databa
14ff0 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65  se file and move
15000 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20   the pager back 
15010 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49  to OPEN state. I
15020 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73  f this .** means
15030 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
15040 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66   hot-journal lef
15050 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
15060 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a  stem, the next .
15070 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  ** connection to
15080 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
15090 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67   lock on the pag
150a0 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  er (which may be
150b0 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77   this one) .** w
150c0 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  ill roll it back
150d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
150e0 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72  ager has not alr
150f0 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
15100 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75   ERROR state, bu
15110 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61  t an IO or.** ma
15120 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
15130 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  s during a rollb
15140 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77  ack, then this w
15150 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65  ill itself cause
15160 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74   .** the pager t
15170 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
15180 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77  R state. Which w
15190 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62  ill be cleared b
151a0 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  y the.** call to
151b0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c   pager_unlock(),
151c0 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62   as described ab
151d0 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ove..*/.static v
151e0 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  oid pagerUnlockA
151f0 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  ndRollback(Pager
15200 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
15210 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
15220 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
15230 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
15240 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20  PAGER_OPEN ){.  
15250 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
15260 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
15270 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ger) );.    if( 
15280 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
15290 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
152a0 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  KED ){.      sql
152b0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
152c0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73  alloc();.      s
152d0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
152e0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
152f0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
15300 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
15310 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
15320 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
15330 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
15340 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
15350 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
15360 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  );.      pager_e
15370 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
15380 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  Pager, 0, 0);.  
15390 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f    }.  }.  pager_
153a0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
153b0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
153c0 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f  er aData must po
153d0 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
153e0 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  of pPager->pageS
153f0 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  ize bytes.** of 
15400 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e  data. Compute an
15410 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
15420 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68  sum based ont th
15430 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
15440 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61  e .** page of da
15450 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  ta and the curre
15460 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67  nt value of pPag
15470 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a  er->cksumInit..*
15480 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
15490 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
154a0 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a  . It is really j
154b0 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
154c0 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
154d0 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61  itial value (pPa
154e0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20  ger->cksumInit) 
154f0 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20  and every 200th 
15500 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  byte.** of the p
15510 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69  age data, starti
15520 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66  ng with byte off
15530 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67  set (pPager->pag
15540 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45  eSize%200)..** E
15550 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
15560 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d  rpreted as an 8-
15570 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  bit unsigned int
15580 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  eger..**.** Chan
15590 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61  ging the formula
155a0 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
155b0 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72   this checksum r
155c0 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20  esults in an.** 
155d0 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75  incompatible jou
155e0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
155f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e  ..**.** If journ
15600 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  al corruption oc
15610 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
15620 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
15630 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a   most likely .**
15640 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61   scenario is tha
15650 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
15660 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
15670 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
15680 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20  nged. .** It is 
15690 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
156a0 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
156b0 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
156c0 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
156d0 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
156e0 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
156f0 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
15700 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
15710 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
15720 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
15730 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
15740 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
15750 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
15760 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
15770 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a  er_cksum(Pager *
15780 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38  pPager, const u8
15790 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
157a0 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
157b0 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
157c0 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76     /* Checksum v
157d0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
157e0 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  /.  int i = pPag
157f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
15800 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
15810 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
15820 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
15830 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
15840 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
15850 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
15860 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cksum;.}../*.** 
15870 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65  Report the curre
15880 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  nt page size and
15890 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
158a0 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a  ved bytes back.*
158b0 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a  * to the codec..
158c0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
158d0 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69  _HAS_CODEC.stati
158e0 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f  c void pagerRepo
158f0 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  rtSize(Pager *pP
15900 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
15910 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
15920 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65  hng ){.    pPage
15930 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
15940 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  g(pPager->pCodec
15950 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
15960 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
15980 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73  int)pPager->nRes
15990 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  erve);.  }.}.#el
159a0 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
159b0 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20  rReportSize(X)  
159c0 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77     /* No-op if w
159d0 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
159e0 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64   a codec */.#end
159f0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
15a00 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a  E_HAS_CODEC./*.*
15a10 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
15a20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
15a30 65 64 20 62 69 74 73 20 69 73 20 74 68 65 20 73  ed bits is the s
15a40 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74 69  ame in the desti
15a50 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72 20  nation.** pager 
15a60 61 73 20 69 74 20 69 73 20 69 6e 20 74 68 65 20  as it is in the 
15a70 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20 63 6f  source.  This co
15a80 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20 56 41  mes up when a VA
15a90 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74 68 65  CUUM changes the
15aa0 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  .** number of re
15ab0 73 65 72 76 65 64 20 62 69 74 73 20 74 6f 20 74  served bits to t
15ac0 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d 6f  he "optimal" amo
15ad0 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  unt..*/.void sql
15ae0 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e 52 65  ite3PagerAlignRe
15af0 73 65 72 76 65 28 50 61 67 65 72 20 2a 70 44 65  serve(Pager *pDe
15b00 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72 63 29  st, Pager *pSrc)
15b10 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6e  {.  if( pDest->n
15b20 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d 3e 6e  Reserve!=pSrc->n
15b30 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20 20 70  Reserve ){.    p
15b40 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 20 3d  Dest->nReserve =
15b50 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65 3b   pSrc->nReserve;
15b60 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
15b70 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20 20 7d  Size(pDest);.  }
15b80 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
15b90 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
15ba0 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20  age from either 
15bb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15bc0 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
15bd0 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74  =1) or.** from t
15be0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28  he sub-journal (
15bf0 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30  if isMainJrnl==0
15c00 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74  ) and playback t
15c10 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65  hat page..** The
15c20 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20   page begins at 
15c30 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20  offset *pOffset 
15c40 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  into the file. T
15c50 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76  he *pOffset.** v
15c60 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65  alue is increase
15c70 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  d to the start o
15c80 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
15c90 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
15ca0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72  **.** The main r
15cb0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
15cc0 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d  uses checksums -
15cd0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
15ce0 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20  ournal does .** 
15cf0 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  not..**.** If th
15d00 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
15d10 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
15d20 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
15d30 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
15d40 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
15d50 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
15d60 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
15d70 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61  dbSize, then pla
15d80 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70  yback is.** skip
15d90 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ped and SQLITE_O
15da0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
15db0 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
15dc0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
15dd0 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
15de0 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
15df0 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
15e00 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
15e10 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
15e20 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
15e30 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
15e40 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
15e50 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
15e60 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
15e70 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
15e80 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
15e90 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
15ea0 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
15eb0 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
15ec0 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
15ed0 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
15ee0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
15ef0 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20   page record is 
15f00 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
15f10 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
15f20 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
15f30 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b   and played back
15f40 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
15f50 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
15f60 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
15f70 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61  urs.** while rea
15f80 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ding the record 
15f90 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
15fa0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
15fb0 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20  hile writing.** 
15fc0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
15fd0 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49  file, then the I
15fe0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
15ff0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74  returned. If dat
16000 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  a.** is successf
16010 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
16020 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
16030 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72   file but appear
16040 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75  s to be.** corru
16050 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
16060 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44  E is returned. D
16070 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ata is considere
16080 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a  d corrupted in.*
16090 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  * two circumstan
160a0 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20  ces:.** .**   * 
160b0 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61  If the record pa
160c0 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c  ge-number is ill
160d0 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52  egal (0 or PAGER
160e0 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a  _MJ_PGNO), or.**
160f0 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
16100 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  rd is being roll
16110 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
16120 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
16130 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68  le.**     and th
16140 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64  e checksum field
16150 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
16160 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65  the record conte
16170 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65  nt..**.** Neithe
16180 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73  r of these two s
16190 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73  cenarios are pos
161a0 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73  sible during a s
161b0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
161c0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  k..**.** If this
161d0 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
161e0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d  rollback, then m
161f0 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74  emory may have t
16200 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
16210 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
16220 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
16230 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
16240 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63  ase and an alloc
16250 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
16260 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
16270 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
16280 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
16290 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
162a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
162b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
162c0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
162d0 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
162e0 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
162f0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
16300 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
16310 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
16320 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
16330 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20  pDone,          
16340 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
16350 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
16360 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
16370 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c    int isMainJrnl
16380 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16390 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75  /* 1 -> main jou
163a0 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a  rnal. 0 -> sub-j
163b0 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74  ournal. */.  int
163c0 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20   isSavepnt      
163d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
163e0 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
163f0 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29  nt rollback */.)
16400 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
16410 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
16420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16430 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
16440 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
16450 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
16480 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
16490 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
164a0 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
164b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
164c0 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
164d0 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
164e0 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61  */.  char *aData
164f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16500 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
16510 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20  storage for the 
16520 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  page */.  sqlite
16530 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
16540 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
16550 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
16560 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  or the journal f
16570 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  ile */.  int isS
16580 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20  ynced;          
16590 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
165a0 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  f journal page i
165b0 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61  s synced */..  a
165c0 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
165d0 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
165e0 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
165f0 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
16600 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
16610 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
16620 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
16630 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
16640 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
16650 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
16660 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
16670 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
16680 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
16690 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
166a0 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
166b0 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
166c0 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
166d0 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
166e0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
166f0 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44  ce;.  assert( aD
16700 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ata );         /
16710 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d  * Temp storage m
16720 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
16730 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
16740 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  */.  assert( pag
16750 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
16760 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a  ==0 || (!isMainJ
16770 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74  rnl && isSavepnt
16780 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65  ) );..  /* Eithe
16790 72 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67  r the state is g
167a0 72 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45  reater than PAGE
167b0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
167c0 44 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  D (a transaction
167d0 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f   .  ** or savepo
167e0 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e  int rollback don
167f0 65 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74  e at the request
16800 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20   of the caller) 
16810 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20  or this is.  ** 
16820 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
16830 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73  llback. If it is
16840 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
16850 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67  ollback, the pag
16860 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74  er.  ** is in st
16870 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c  ate OPEN and hol
16880 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ds an EXCLUSIVE 
16890 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61  lock. Hot-journa
168a0 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  l rollback.  ** 
168b0 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20  only reads from 
168c0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
168d0 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f  , not the sub-jo
168e0 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
168f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
16900 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
16910 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
16920 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
16930 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
16940 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  N && pPager->eLo
16950 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
16960 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  CK).  );.  asser
16970 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
16980 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
16990 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61  CACHEMOD || isMa
169a0 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20  inJrnl );..  /* 
169b0 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
169c0 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61  mber and page da
169d0 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ta from the jour
169e0 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
169f0 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65  al.  ** file. Re
16a00 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
16a10 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
16a20 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
16a30 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a  occurs..  */.  j
16a40 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  fd = isMainJrnl 
16a50 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
16a60 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20  pPager->sjfd;.  
16a70 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
16a80 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26  jfd, *pOffset, &
16a90 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21  pgno);.  if( rc!
16aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
16ab0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
16ac0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64  qlite3OsRead(jfd
16ad0 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
16ae0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
16af0 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20  (*pOffset)+4);. 
16b00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16b10 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
16b20 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50    *pOffset += pP
16b30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
16b40 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a   4 + isMainJrnl*
16b50 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
16b60 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
16b70 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
16b80 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
16b90 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
16ba0 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
16bb0 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
16bc0 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
16bd0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
16be0 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
16bf0 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
16c00 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
16c10 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
16c20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
16c30 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
16c40 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
16c50 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
16c60 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
16c70 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
16c80 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
16c90 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
16ca0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
16cb0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16cc0 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20  !isSavepnt );.  
16cd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16ce0 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
16cf0 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65  pgno>(Pgno)pPage
16d00 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c  r->dbSize || sql
16d10 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
16d20 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  Done, pgno) ){. 
16d30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16d40 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  _OK;.  }.  if( i
16d50 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
16d60 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
16d70 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29  (jfd, (*pOffset)
16d80 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  -4, &cksum);.   
16d90 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
16da0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73   rc;.    if( !is
16db0 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72  Savepnt && pager
16dc0 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
16dd0 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75  u8*)aData)!=cksu
16de0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
16df0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
16e00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
16e10 66 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20  f this page has 
16e20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
16e30 79 65 64 20 62 61 63 6b 20 62 65 66 6f 72 65 20  yed back before 
16e40 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  during the curre
16e50 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  nt.  ** rollback
16e60 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74  , then don't bot
16e70 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20 62  her to play it b
16e80 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a  ack again..  */.
16e90 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28    if( pDone && (
16ea0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
16eb0 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e  ecSet(pDone, pgn
16ec0 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  o))!=SQLITE_OK )
16ed0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
16ee0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
16ef0 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67  playing back pag
16f00 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65  e 1, restore the
16f10 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69 6e   nReserve settin
16f20 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  g.  */.  if( pgn
16f30 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e  o==1 && pPager->
16f40 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a 29  nReserve!=((u8*)
16f50 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20  aData)[20] ){.  
16f60 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72    pPager->nReser
16f70 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74 61  ve = ((u8*)aData
16f80 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65 72  )[20];.    pager
16f90 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
16fa0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r);.  }..  /* If
16fb0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
16fc0 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2c   CACHEMOD state,
16fd0 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
16fe0 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
16ff0 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
17000 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
17010 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
17020 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
17030 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
17040 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
17050 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
17060 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
17070 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
17080 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
17090 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
170a0 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
170b0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
170c0 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
170d0 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
170e0 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
170f0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
17100 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
17110 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
17120 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
17130 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
17140 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
17150 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
17160 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
17170 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
17180 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
17190 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
171a0 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
171b0 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
171c0 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
171d0 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
171e0 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
171f0 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
17200 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57 52  **.  ** If in WR
17210 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54  ITER_DBMOD, WRIT
17220 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20 4f  ER_FINISHED or O
17230 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e 20  PEN state, then 
17240 77 65 20 75 70 64 61 74 65 20 74 68 65 0a 20 20  we update the.  
17250 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65 20 69  ** pager cache i
17260 66 20 69 74 20 65 78 69 73 74 73 20 61 6e 64 20  f it exists and 
17270 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
17280 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
17290 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74  marked .  ** not
172a0 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74 68   dirty. Since th
172b0 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20  is code is only 
172c0 65 78 65 63 75 74 65 64 20 69 6e 20 50 41 47 45  executed in PAGE
172d0 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f 72  R_OPEN state for
172e0 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72  .  ** a hot-jour
172f0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  nal rollback, it
17300 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
17310 68 61 74 20 74 68 65 20 70 61 67 65 2d 63 61 63  hat the page-cac
17320 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a  he is empty.  **
17330 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
17340 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a   in OPEN state..
17350 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74    **.  ** Ticket
17360 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61   #1171:  The sta
17370 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d  tement journal m
17380 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67  ight contain pag
17390 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69  e content that i
173a0 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74  s.  ** different
173b0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63   from the page c
173c0 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74  ontent at the st
173d0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
173e0 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69  action..  ** Thi
173f0 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20  s occurs when a 
17400 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20  page is changed 
17410 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
17420 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e  rt of a statemen
17430 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e  t.  ** then chan
17440 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e  ged again within
17450 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
17460 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
17470 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73  ck such a.  ** s
17480 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74  tatement we must
17490 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
174a0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
174b0 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e  ase unless we kn
174c0 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74  ow.  ** for cert
174d0 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ain that origina
174e0 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
174f0 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20  are synced into 
17500 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
17510 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
17520 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f   Otherwise, a po
17530 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c  wer loss might l
17540 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61  eave modified da
17550 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ta in the.  ** d
17560 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74  atabase file wit
17570 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  hout an entry in
17580 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
17590 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20  urnal that can. 
175a0 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20   ** restore the 
175b0 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
175c0 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20  original form.  
175d0 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d  Two conditions m
175e0 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20  ust be.  ** met 
175f0 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
17600 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
17610 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61  iles. (1) the da
17620 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20  tabase must be. 
17630 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29   ** locked.  (2)
17640 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
17650 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
17660 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79  content is fully
17670 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20   synced.  ** in 
17680 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
17690 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
176a0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
176b0 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65  in cache or else
176c0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69  .  ** the page i
176d0 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64  s marked as need
176e0 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20  Sync==0..  **.  
176f0 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20  ** 2008-04-14:  
17700 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20  When attempting 
17710 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72  to vacuum a corr
17720 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
17730 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f  e, it.  ** is po
17740 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61  ssible to fail a
17750 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20   statement on a 
17760 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64 6f  database that do
17770 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74  es not yet exist
17780 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74  ..  ** Do not at
17790 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69  tempt to write i
177a0 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
177b0 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f  has never been o
177c0 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  pened..  */.  if
177d0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
177e0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67  ager) ){.    pPg
177f0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
17800 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
17810 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
17820 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  er, pgno);.  }. 
17830 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20   assert( pPg || 
17840 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
17850 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
17860 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te!=PAGER_OPEN |
17870 7c 20 70 50 67 3d 3d 30 20 7c 7c 20 70 50 61 67  | pPg==0 || pPag
17880 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
17890 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50    PAGERTRACE(("P
178a0 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
178b0 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73  %d hash(%08x) %s
178c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
178d0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
178e0 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
178f0 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
17900 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61  geSize, (u8*)aDa
17910 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ta),.           
17920 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69  (isMainJrnl?"mai
17930 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d  n-journal":"sub-
17940 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a  journal").  ));.
17950 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
17960 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64   ){.    isSynced
17970 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e   = pPager->noSyn
17980 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c  c || (*pOffset <
17990 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
179a0 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lHdr);.  }else{.
179b0 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28      isSynced = (
179c0 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50  pPg==0 || 0==(pP
179d0 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
179e0 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20  _NEED_SYNC));.  
179f0 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  }.  if( isOpen(p
17a00 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26  Pager->fd).   &&
17a10 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
17a20 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
17a30 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
17a40 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
17a50 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63  EN).   && isSync
17a60 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ed.  ){.    i64 
17a70 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  ofst = (pgno-1)*
17a80 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
17a90 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63  eSize;.    testc
17aa0 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74 20  ase( !isSavepnt 
17ab0 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70 50  && pPg!=0 && (pP
17ac0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
17ad0 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a  EED_SYNC)!=0 );.
17ae0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
17af0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
17b00 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
17b10 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
17b20 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44  er->fd, (u8 *)aD
17b30 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
17b40 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
17b50 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
17b60 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
17b70 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
17b80 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
17b90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17ba0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
17bb0 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
17bc0 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
17bd0 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
17be0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20  E_NOMEM_BKPT);. 
17bf0 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
17c00 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
17c10 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
17c20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
17c30 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
17c40 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
17c50 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
17c60 4d 5f 42 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a  M_BKPT, aData);.
17c70 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
17c80 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26  ( !isMainJrnl &&
17c90 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
17ca0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
17cb0 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76  ollback of a sav
17cc0 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20  epoint and data 
17cd0 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  was not written 
17ce0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
17cf0 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 70  tabase and the p
17d00 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65  age is not in-me
17d10 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20 61  mory, there is a
17d20 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a   potential.    *
17d30 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20  * problem. When 
17d40 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78 74  the page is next
17d50 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65 20   fetched by the 
17d60 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74  b-tree layer, it
17d70 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65   .    ** will be
17d80 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
17d90 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
17da0 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
17db0 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75  ot be .    ** cu
17dc0 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20  rrent. .    **. 
17dd0 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
17de0 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66  a couple of diff
17df0 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73 20  erent ways this 
17e00 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20  can happen. All 
17e10 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a  are quite.    **
17e20 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72   obscure. When r
17e30 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72  unning in synchr
17e40 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73  onous mode, this
17e50 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
17e60 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20   .    ** if the 
17e70 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66  page is on the f
17e80 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20  ree-list at the 
17e90 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
17ea0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20  nsaction, then. 
17eb0 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c     ** populated,
17ec0 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e   then moved usin
17ed0 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  g sqlite3PagerMo
17ee0 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a  vepage()..    **
17ef0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
17f00 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61  tion is to add a
17f10 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
17f20 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f   to the cache co
17f30 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  ntaining.    ** 
17f40 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 65  the data just re
17f50 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ad from the sub-
17f60 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68  journal. Mark th
17f70 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 20  e page as dirty 
17f80 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74  .    ** and if t
17f90 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72 65  he pager require
17fa0 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  s a journal-sync
17fb0 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20  , then mark the 
17fc0 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  page as .    ** 
17fd0 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72  requiring a jour
17fe0 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20  nal-sync before 
17ff0 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20  it is written.. 
18000 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
18010 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20  ( isSavepnt );. 
18020 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
18030 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
18040 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
18050 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ACK)==0 );.    p
18060 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
18070 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52  l |= SPILLFLAG_R
18080 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63 20  OLLBACK;.    rc 
18090 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
180a0 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
180b0 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73  &pPg, 1);.    as
180c0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
180d0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
180e0 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21  LFLAG_ROLLBACK)!
180f0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
18100 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20  ->doNotSpill &= 
18110 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  ~SPILLFLAG_ROLLB
18120 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ACK;.    if( rc!
18130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
18140 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69  urn rc;.    sqli
18150 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
18160 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ty(pPg);.  }.  i
18170 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
18180 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
18190 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
181a0 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
181b0 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
181c0 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
181d0 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
181e0 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
181f0 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
18200 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
18210 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
18220 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
18230 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
18240 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
18250 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
18260 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
18270 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
18280 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
18290 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
182a0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
182b0 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
182c0 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
182d0 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70    pData = pPg->p
182e0 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Data;.    memcpy
182f0 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61  (pData, (u8*)aDa
18300 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
18310 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
18320 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
18330 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20 75 73 65  );.    /* It use
18340 64 20 74 6f 20 62 65 20 74 68 61 74 20 73 71 6c  d to be that sql
18350 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
18360 65 61 6e 28 70 50 67 29 20 77 61 73 20 63 61 6c  ean(pPg) was cal
18370 6c 65 64 20 68 65 72 65 2e 20 20 42 75 74 0a 20  led here.  But. 
18380 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6c 6c 20     ** that call 
18390 77 61 73 20 64 61 6e 67 65 72 6f 75 73 20 61 6e  was dangerous an
183a0 64 20 68 61 64 20 6e 6f 20 64 65 74 65 63 74 61  d had no detecta
183b0 62 6c 65 20 62 65 6e 65 66 69 74 20 73 69 6e 63  ble benefit sinc
183c0 65 20 74 68 65 20 63 61 63 68 65 0a 20 20 20 20  e the cache.    
183d0 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  ** is normally c
183e0 6c 65 61 6e 65 64 20 62 79 20 73 71 6c 69 74 65  leaned by sqlite
183f0 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
18400 29 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  ) after rollback
18410 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a 20 68   and so.    ** h
18420 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e  as been removed.
18430 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 73 65   */.    pager_se
18440 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
18450 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
18460 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
18470 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
18480 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
18490 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
184a0 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
184b0 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
184c0 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
184d0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
184e0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
184f0 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
18500 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
18510 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
18520 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
18530 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
18540 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
18550 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44   disk */.    COD
18560 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
18570 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c  a, pPg->pgno, 3,
18580 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
18590 5f 42 4b 50 54 29 3b 0a 20 20 20 20 73 71 6c 69  _BKPT);.    sqli
185a0 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
185b0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
185c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
185d0 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
185e0 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
185f0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
18600 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
18610 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
18620 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
18630 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
18640 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
18650 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
18660 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
18670 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
18680 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
18690 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
186a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
186b0 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
186c0 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
186d0 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65   Argument zMaste
186e0 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50  r may point to P
186f0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20  ager.pTmpSpace. 
18700 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69  So that buffer i
18710 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61  s not .** availa
18720 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ble for use with
18730 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
18740 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d  ..**.** When a m
18750 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18760 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69  le is created, i
18770 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  t is populated w
18780 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a  ith the names .*
18790 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20  * of all of its 
187a0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20  child journals, 
187b0 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65  one after anothe
187c0 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20  r, formatted as 
187d0 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65  utf-8 .** encode
187e0 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20  d text. The end 
187f0 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  of each child jo
18800 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61  urnal file is ma
18810 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20  rked with a .** 
18820 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
18830 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e  yte (0x00). i.e.
18840 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
18850 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72  ents of a master
18860 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
18870 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
18880 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f  on involving two
18890 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74   databases might
188a0 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68   be:.**.**   "/h
188b0 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f  ome/bill/a.db-jo
188c0 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62  urnal\x00/home/b
188d0 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/b.db-journal
188e0 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61  \x00".**.** A ma
188f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18900 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65  e may only be de
18910 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f  leted once all o
18920 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20  f its child .** 
18930 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65  journals have be
18940 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
18950 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
18960 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f  ion reads the co
18970 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
18980 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
18990 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72  e into .** memor
189a0 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f  y and loops thro
189b0 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20  ugh each of the 
189c0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61  child journal na
189d0 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68  mes. For.** each
189e0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20   child journal, 
189f0 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a  it checks if:.**
18a00 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
18a10 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69  hild journal exi
18a20 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a  sts, and if so.*
18a30 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
18a40 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  ld journal conta
18a50 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  ins a reference 
18a60 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  to master journa
18a70 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a  l .**     file z
18a80 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  Master.**.** If 
18a90 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  a child journal 
18aa0 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61  can be found tha
18ab0 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f  t matches both o
18ac0 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  f the criteria.*
18ad0 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75  * above, this fu
18ae0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
18af0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
18b00 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  thing. Otherwise
18b10 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  , if.** no such 
18b20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
18b30 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65  n be found, file
18b40 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65   zMaster is dele
18b50 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
18b60 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e  file-system usin
18b70 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
18b80 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
18b90 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e   IO error within
18ba0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
18bb0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
18bc0 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
18bd0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  ** function allo
18be0 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20  cates memory by 
18bf0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d  calling sqlite3M
18c00 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61  alloc(). If an a
18c10 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69  llocation.** fai
18c20 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
18c30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
18c40 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49  herwise, if no I
18c50 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  O or malloc erro
18c60 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51  rs .** occur, SQ
18c70 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18c80 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ned..**.** TODO:
18c90 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
18ca0 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c  llocates a singl
18cb0 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
18cc0 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65  y to load.** the
18cd0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
18ce0 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
18cf0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
18d00 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20  s could be.** a 
18d10 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79  couple of kiloby
18d20 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65  tes or so - pote
18d30 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74  ntially larger t
18d40 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a  han the page .**
18d50 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
18d60 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
18d70 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
18d80 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
18d90 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
18da0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
18db0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
18dc0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
18dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
18de0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
18df0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
18e00 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f  ter;    /* Mallo
18e10 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  c'd master-journ
18e20 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
18e30 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
18e40 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20  file *pJournal; 
18e50 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68    /* Malloc'd ch
18e60 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild-journal file
18e70 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
18e80 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
18e90 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
18ea0 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
18eb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
18ec0 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f  .  i64 nMasterJo
18ed0 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  urnal;       /* 
18ee0 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
18ef0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
18f00 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
18f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
18f20 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75  inter to one jou
18f30 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66  rnal within MJ f
18f40 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
18f50 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
18f60 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
18f70 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20  old MJ filename 
18f80 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66  from a journal f
18f90 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ile */.  int nMa
18fa0 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
18fb0 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
18fc0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
18fd0 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20  to zMasterPtr[] 
18fe0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
18ff0 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
19000 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
19010 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
19020 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
19030 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
19040 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
19050 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
19060 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
19070 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
19080 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
19090 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
190a0 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
190b0 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
190c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
190d0 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
190e0 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
190f0 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
19100 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
19110 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
19120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
19130 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
19140 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
19150 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
19160 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
19170 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
19180 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
19190 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
191a0 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
191b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
191c0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
191d0 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a  aster_out;..  /*
191e0 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
191f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19200 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
19210 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
19220 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
19230 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
19240 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
19250 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74  rnal.   Also obt
19260 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69  ain.  ** suffici
19270 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d  ent space (in zM
19280 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c  asterPtr) to hol
19290 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d  d the names of m
192a0 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e  aster.  ** journ
192b0 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74  al files extract
192c0 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20  ed from regular 
192d0 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
192e0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
192f0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19300 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
19310 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
19320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19330 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
19340 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50  _out;.  nMasterP
19350 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  tr = pVfs->mxPat
19360 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74  hname+1;.  zMast
19370 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  erJournal = sqli
19380 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  te3Malloc(nMaste
19390 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
193a0 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66  erPtr + 1);.  if
193b0 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
193c0 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
193d0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
193e0 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73  .    goto delmas
193f0 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a  ter_out;.  }.  z
19400 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
19410 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
19420 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20  terJournal+1];. 
19430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
19440 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
19450 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e  sterJournal, (in
19460 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  t)nMasterJournal
19470 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
19480 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
19490 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
194a0 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
194b0 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d  [nMasterJournal]
194c0 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61   = 0;..  zJourna
194d0 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
194e0 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a  al;.  while( (zJ
194f0 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
19500 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
19510 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  urnal ){.    int
19520 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20   exists;.    rc 
19530 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
19540 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
19550 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
19560 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
19570 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
19580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19590 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
195a0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
195b0 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  f( exists ){.   
195c0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
195d0 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
195e0 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
195f0 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
19600 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  s..      ** Open
19610 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
19620 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
19630 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19640 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f  . If.      ** so
19650 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
19660 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
19670 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19680 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
19690 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69    int c;.      i
196a0 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
196b0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
196c0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
196d0 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
196e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
196f0 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
19700 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
19710 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
19720 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19730 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
19740 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19750 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
19760 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
19770 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
19780 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
19790 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
197a0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
197b0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
197c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
197d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
197e0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
197f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
19800 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
19810 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
19820 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
19830 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66  er)==0;.      if
19840 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ( c ){.        /
19850 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
19860 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
19870 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19880 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
19890 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
198a0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
198b0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72  .    }.    zJour
198c0 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
198d0 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
198e0 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71  )+1);.  }. .  sq
198f0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
19900 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ster);.  rc = sq
19910 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
19920 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
19930 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
19940 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
19950 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
19960 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
19970 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
19980 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
19990 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
199a0 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
199b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
199c0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
199d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
199e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
199f0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
19a00 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
19a10 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
19a20 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
19a30 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
19a40 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
19a50 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
19a60 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
19a70 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
19a80 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
19a90 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
19aa0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
19ab0 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
19ac0 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
19ad0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
19ae0 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65  not open, or the
19af0 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
19b00 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44   either.** DBMOD
19b10 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
19b20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
19b30 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
19b40 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a  ise, the size .*
19b50 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
19b60 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67   changed to nPag
19b70 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70  e pages (nPage*p
19b80 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
19b90 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74  bytes). .** If t
19ba0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
19bb0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72  is currently lar
19bc0 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70  ger than nPage p
19bd0 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74  ages, then use t
19be0 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63  he VFS.** xTrunc
19bf0 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20  ate() method to 
19c00 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a  truncate it..**.
19c10 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20  ** Or, it might 
19c20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
19c30 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
19c40 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
19c50 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65  n .** nPage page
19c60 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  s. Some operatin
19c70 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65  g system impleme
19c80 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74  ntations can get
19c90 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a   confused if .**
19ca0 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e   you try to trun
19cb0 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
19cc0 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
19cd0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
19ce0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73  .** currently is
19cf0 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73  , so detect this
19d00 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20   case and write 
19d10 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79  a single zero by
19d20 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e  te to .** the en
19d30 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  d of the new fil
19d40 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  e instead..**.**
19d50 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
19d60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19d70 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
19d80 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f   occurs while mo
19d90 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64  difying.** the d
19da0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65  atabase file, re
19db0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
19dc0 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
19dd0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
19de0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
19df0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
19e00 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
19e10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19e20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19e30 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
19e40 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
19e50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
19e60 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45  ate!=PAGER_READE
19e70 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73  R );.  .  if( is
19e80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
19e90 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d   .   && (pPager-
19ea0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
19eb0 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
19ec0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
19ed0 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b  AGER_OPEN) .  ){
19ee0 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
19ef0 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
19f00 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20     int szPage = 
19f10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19f20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
19f30 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
19f40 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
19f50 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69     /* TODO: Is i
19f60 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61  t safe to use Pa
19f70 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68  ger.dbFileSize h
19f80 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ere? */.    rc =
19f90 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
19fa0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
19fb0 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
19fc0 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61    newSize = szPa
19fd0 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20  ge*(i64)nPage;. 
19fe0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19ff0 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53  E_OK && currentS
1a000 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ize!=newSize ){.
1a010 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e        if( curren
1a020 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b  tSize>newSize ){
1a030 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1a040 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
1a050 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53  pPager->fd, newS
1a060 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
1a070 65 20 69 66 28 20 28 63 75 72 72 65 6e 74 53 69  e if( (currentSi
1a080 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53  ze+szPage)<=newS
1a090 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ize ){.        c
1a0a0 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67  har *pTmp = pPag
1a0b0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1a0c0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54         memset(pT
1a0d0 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a  mp, 0, szPage);.
1a0e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1a0f0 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  ( (newSize-szPag
1a100 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a  e) == currentSiz
1a110 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  e );.        tes
1a120 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d  tcase( (newSize-
1a130 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72 65  szPage) >  curre
1a140 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
1a150 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a160 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
1a170 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20  , pTmp, szPage, 
1a180 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b  newSize-szPage);
1a190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a1a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a1b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1a1c0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
1a1d0 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a   nPage;.      }.
1a1e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a1f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a200 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a  Return a sanitiz
1a210 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
1a220 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66  e sector-size of
1a230 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20   OS file pFile. 
1a240 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
1a250 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  lue is guarantee
1a260 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e  d to lie between
1a270 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54   32 and MAX_SECT
1a280 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20  OR_SIZE..*/.int 
1a290 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a  sqlite3SectorSiz
1a2a0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1a2b0 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52  pFile){.  int iR
1a2c0 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  et = sqlite3OsSe
1a2d0 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b  ctorSize(pFile);
1a2e0 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32 20 29  .  if( iRet<32 )
1a2f0 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31 32  {.    iRet = 512
1a300 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52  ;.  }else if( iR
1a310 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  et>MAX_SECTOR_SI
1a320 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE ){.    assert
1a330 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  ( MAX_SECTOR_SIZ
1a340 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52  E>=512 );.    iR
1a350 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f  et = MAX_SECTOR_
1a360 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  SIZE;.  }.  retu
1a370 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iRet;.}../*.*
1a380 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
1a390 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63  of the Pager.sec
1a3a0 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
1a3b0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
1a3c0 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e  * pager based on
1a3d0 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1a3e0 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
1a3f0 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a  orSize method.**
1a400 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74   of the open dat
1a410 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
1a420 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
1a430 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20   be used .** to 
1a440 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
1a450 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74  ze and alignment
1a460 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
1a470 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65  er and .** maste
1a480 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
1a490 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65  rs within create
1a4a0 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  d journal files.
1a4b0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
1a4c0 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65  rary files the e
1a4d0 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1a4e0 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35  size is always 5
1a4f0 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  12 bytes..**.** 
1a500 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e  Otherwise, for n
1a510 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  on-temporary fil
1a520 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76  es, the effectiv
1a530 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1a540 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1a550 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
1a560 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68  ectorSize() meth
1a570 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  od rounded up to
1a580 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20   32 if.** it is 
1a590 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72  less than 32, or
1a5a0 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f   rounded down to
1a5b0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a5c0 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65   if it.** is gre
1a5d0 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45  ater than MAX_SE
1a5e0 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a  CTOR_SIZE..**.**
1a5f0 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   If the file has
1a600 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
1a610 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1a620 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20  WRITE property, 
1a630 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20  then set.** the 
1a640 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1a650 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e   size to its min
1a660 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29  imum value (512)
1a670 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  .  The purpose o
1a680 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63  f.** pPager->sec
1a690 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65  torSize is to de
1a6a0 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20  fine the "blast 
1a6b0 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 73  radius" of bytes
1a6c0 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
1a6d0 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73 68  hange if a crash
1a6e0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72   occurs while wr
1a6f0 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c  iting to a singl
1a700 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61  e byte in.** tha
1a710 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69  t range.  But wi
1a720 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  th POWERSAFE_OVE
1a730 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73  RWRITE, the blas
1a740 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f  t radius is zero
1a750 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68 61  .** (that is wha
1a760 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  t POWERSAFE_OVER
1a770 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f  WRITE means), so
1a780 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   we minimize the
1a790 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e   sector.** size.
1a7a0 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20    For backwards 
1a7b0 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66  compatibility of
1a7c0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1a7d0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1a7e0 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20  t,.** we cannot 
1a7f0 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63  reduce the effec
1a800 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a810 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73   below 512..*/.s
1a820 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
1a830 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
1a840 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
1a850 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1a860 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1a870 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
1a880 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
1a890 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69  File.   || (sqli
1a8a0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
1a8b0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
1a8c0 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20  r->fd) & .      
1a8d0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1a8e0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1a8f0 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29  VERWRITE)!=0.  )
1a900 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20  {.    /* Sector 
1a910 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74  size doesn't mat
1a920 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  ter for temporar
1a930 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74  y files. Also, t
1a940 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d  he file.    ** m
1a950 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ay not have been
1a960 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20   opened yet, in 
1a970 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f  which case the O
1a980 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
1a990 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73    ** call will s
1a9a0 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20  egfault. */.    
1a9b0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1a9c0 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73  ze = 512;.  }els
1a9d0 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  e{.    pPager->s
1a9e0 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
1a9f0 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50  te3SectorSize(pP
1aa00 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d  ager->fd);.  }.}
1aa10 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
1aa20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1aa30 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
1aa40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1aa50 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
1aa60 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
1aa70 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
1aa80 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
1aa90 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
1aaa0 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
1aab0 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
1aac0 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
1aad0 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
1aae0 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
1aaf0 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
1ab00 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1ab10 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1ab20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
1ab30 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
1ab40 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
1ab50 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
1ab60 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
1ab70 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
1ab80 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
1ab90 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
1aba0 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
1abb0 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
1abc0 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
1abd0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1abe0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
1abf0 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
1ac00 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
1ac10 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
1ac20 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
1ac30 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1ac40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1ac50 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
1ac60 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
1ac70 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
1ac80 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
1ac90 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
1aca0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1acb0 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
1acc0 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
1acd0 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
1ace0 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
1acf0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
1ad00 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
1ad10 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1ad20 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
1ad30 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
1ad40 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
1ad50 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
1ad60 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
1ad70 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
1ad80 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
1ad90 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
1ada0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
1adb0 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
1adc0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
1add0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1ade0 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
1adf0 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
1ae00 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
1ae10 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
1ae20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
1ae30 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
1ae40 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
1ae50 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
1ae60 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
1ae70 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
1ae80 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
1ae90 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
1aea0 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
1aeb0 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
1aec0 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
1aed0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
1aee0 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
1aef0 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
1af00 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
1af10 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
1af20 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
1af30 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
1af40 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1af50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
1af60 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
1af70 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
1af80 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
1af90 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
1afa0 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
1afb0 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
1afc0 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
1afd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1afe0 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
1aff0 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
1b000 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
1b010 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
1b020 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
1b030 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
1b040 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
1b050 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
1b060 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
1b070 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
1b080 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
1b090 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
1b0a0 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
1b0b0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1b0c0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
1b0d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
1b0e0 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
1b0f0 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
1b100 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
1b110 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
1b120 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1b130 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
1b140 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
1b150 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
1b160 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
1b170 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
1b180 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
1b190 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
1b1a0 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
1b1b0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1b1c0 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
1b1d0 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
1b1e0 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
1b1f0 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
1b200 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
1b210 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
1b220 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
1b230 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
1b240 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
1b250 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
1b260 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
1b270 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1b280 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
1b290 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
1b2a0 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
1b2b0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
1b2c0 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
1b2d0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1b2e0 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
1b2f0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1b300 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
1b310 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
1b320 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
1b330 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
1b340 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
1b350 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
1b360 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
1b370 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1b380 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
1b390 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
1b3a0 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
1b3b0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1b3c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1b3d0 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
1b3e0 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
1b3f0 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
1b400 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
1b410 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
1b420 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
1b430 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
1b440 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
1b450 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
1b460 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
1b470 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
1b480 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
1b490 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1b4a0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
1b4b0 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
1b4c0 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
1b4d0 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
1b4e0 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
1b4f0 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
1b500 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
1b510 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
1b520 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
1b530 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
1b540 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
1b550 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
1b560 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
1b570 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1b580 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1b590 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
1b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5b0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
1b5c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
1b5d0 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
1b5e0 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1b5f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b600 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
1b610 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
1b620 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1b630 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1b640 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1b650 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
1b660 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1b670 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
1b680 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
1b690 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6b0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
1b6c0 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
1b6d0 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
1b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b6f0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1b700 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
1b710 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
1b720 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
1b730 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
1b740 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1b750 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
1b760 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
1b770 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1b780 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
1b790 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
1b7a0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  rollback */.  in
1b7b0 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b  t nPlayback = 0;
1b7c0 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1b7d0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1b7e0 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f  restored from jo
1b7f0 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46  urnal */..  /* F
1b800 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
1b810 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
1b820 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1b830 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
1b840 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
1b850 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
1b860 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1b870 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
1b880 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b890 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1b8a0 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
1b8b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b8c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
1b8d0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
1b8e0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61    /* Read the ma
1b8f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
1b900 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
1b910 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  al, if it is pre
1b920 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20  sent..  ** If a 
1b930 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1b940 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63  ile name is spec
1b950 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66  ified, but the f
1b960 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ile is not.  ** 
1b970 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c  present on disk,
1b980 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1b990 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64  l is not hot and
1b9a0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1b9b0 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64  o be.  ** played
1b9c0 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   back..  **.  **
1b9d0 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c   TODO: Technical
1b9e0 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
1b9f0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63   is an error bec
1ba00 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20  ause it assumes 
1ba10 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72  that.  ** buffer
1ba20 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
1ba30 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b   is (mxPathname+
1ba40 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67  1) bytes or larg
1ba50 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20  er. i.e. that.  
1ba60 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ** (pPager->page
1ba70 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e  Size >= pPager->
1ba80 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1ba90 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e  +1). Using os_un
1baa0 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74  ix.c,.  ** mxPat
1bab0 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68  hname is 512, wh
1bac0 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20  ich is the same 
1bad0 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61  as the minimum a
1bae0 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20  llowable value. 
1baf0 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65   ** for pageSize
1bb00 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  ..  */.  zMaster
1bb10 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1bb20 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61  pace;.  rc = rea
1bb30 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1bb40 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1bb50 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1bb60 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1bb70 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1bb80 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1bb90 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [0] ){.    rc = 
1bba0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1bbb0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
1bbc0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1bbd0 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a  STS, &res);.  }.
1bbe0 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
1bbf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bc00 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20  OK || !res ){.  
1bc10 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1bc20 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
1bc30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1bc40 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65  0;.  needPagerRe
1bc50 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20  set = isHot;..  
1bc60 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
1bc70 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
1bc80 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61  hen a readJourna
1bc90 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20  lHdr() or .  ** 
1bca0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1bcb0 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72  ne_page() call r
1bcc0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1bcd0 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
1bce0 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20  r .  ** occurs. 
1bcf0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  .  */.  while( 1
1bd00 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20   ){.    /* Read 
1bd10 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
1bd20 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
1bd30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1bd40 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
1bd50 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
1bd60 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
1bd70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1bd80 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
1bd90 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
1bda0 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
1bdb0 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
1bdc0 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
1bdd0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
1bde0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
1bdf0 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
1be00 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
1be10 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
1be20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
1be30 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
1be40 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c  ger, isHot, szJ,
1be50 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
1be60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1be70 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
1be80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1be90 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
1bea0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1beb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1bec0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1bed0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1bee0 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
1bef0 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
1bf00 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
1bf10 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
1bf20 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
1bf30 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
1bf40 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1bf50 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
1bf60 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
1bf70 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
1bf80 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
1bf90 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
1bfa0 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
1bfb0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
1bfc0 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
1bfd0 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
1bfe0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1bff0 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
1c000 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
1c010 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1c020 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1c030 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1c040 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
1c050 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
1c060 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1c070 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
1c080 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
1c090 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1c0a0 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
1c0b0 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
1c0c0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
1c0d0 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
1c0e0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
1c0f0 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
1c100 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
1c110 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
1c120 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
1c130 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
1c140 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1c150 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
1c160 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
1c170 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
1c180 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
1c190 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
1c1a0 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
1c1b0 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
1c1c0 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
1c1d0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
1c1e0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
1c1f0 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
1c200 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
1c210 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
1c220 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
1c230 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
1c240 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
1c250 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
1c260 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
1c270 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
1c280 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
1c290 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
1c2a0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1c2b0 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
1c2c0 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
1c2d0 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
1c2e0 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
1c2f0 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
1c300 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1c310 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1c320 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1c330 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
1c340 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
1c350 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1c360 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
1c370 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
1c380 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
1c390 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
1c3a0 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
1c3b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1c3c0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1c3d0 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
1c3e0 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
1c3f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c400 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
1c410 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
1c420 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1c430 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
1c440 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
1c450 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
1c460 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
1c470 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1c480 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1c490 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
1c4a0 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
1c4b0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
1c4c0 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
1c4d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
1c4e0 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
1c4f0 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
1c500 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c510 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
1c520 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1c530 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
1c540 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
1c550 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
1c560 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c570 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c580 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1c590 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
1c5a0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1c5b0 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
1c5c0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
1c5d0 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
1c5e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1c5f0 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
1c600 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
1c610 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61  e file and/or pa
1c620 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  ge cache..    */
1c630 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  .    for(u=0; u<
1c640 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  nRec; u++){.    
1c650 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52    if( needPagerR
1c660 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  eset ){.        
1c670 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1c680 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65  er);.        nee
1c690 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b  dPagerReset = 0;
1c6a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1c6b0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1c6c0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
1c6d0 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er,&pPager->jour
1c6e0 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20  nalOff,0,1,0);. 
1c6f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c710 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20    nPlayback++;. 
1c720 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c730 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c740 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1c750 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1c760 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
1c770 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1c780 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1c790 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1c7a0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1c7b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1c7c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
1c7d0 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c   been truncated,
1c7e0 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61   simply stop rea
1c7f0 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20  ding and.       
1c800 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
1c810 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68   the journal. Th
1c820 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20  is might happen 
1c830 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  if the journal w
1c840 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  as.          ** 
1c850 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77  not completely w
1c860 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65  ritten and synce
1c870 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61  d prior to a cra
1c880 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20  sh.  In that.   
1c890 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20         ** case, 
1c8a0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
1c8b0 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62  uld have never b
1c8c0 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74  een written in t
1c8d0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
1c8e0 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69  first place so i
1c8f0 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c  t is OK to simpl
1c900 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f  y abandon the ro
1c910 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20  llback. */.     
1c920 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c930 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
1c940 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1c950 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c960 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1c970 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
1c980 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74  o rollback, quit
1c990 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
1c9a0 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
1c9b0 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77  ** code.  This w
1c9c0 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61  ill cause the pa
1c9d0 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
1c9e0 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20   error state.   
1c9f0 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61         ** so tha
1ca00 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72  t no further har
1ca10 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20  m will be done. 
1ca20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78   Perhaps the nex
1ca30 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  t.          ** p
1ca40 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61  rocess to come a
1ca50 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c  long will be abl
1ca60 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  e to rollback th
1ca70 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
1ca80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ca90 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1caa0 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  back;.        }.
1cab0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1cac0 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
1cad0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  */.  assert( 0 )
1cae0 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a  ;..end_playback:
1caf0 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20  .  /* Following 
1cb00 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  a rollback, the 
1cb10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
1cb20 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20  ould be back in 
1cb30 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
1cb40 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f  * state prior to
1cb50 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1cb60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73  e transaction, s
1cb70 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a  o invoke the.  *
1cb80 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  * SQLITE_FCNTL_D
1cb90 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65  B_UNCHANGED file
1cba0 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  -control method 
1cbb0 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20  to disable the. 
1cbc0 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68   ** assertion th
1cbd0 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
1cbe0 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d  on counter was m
1cbf0 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69  odified..  */.#i
1cc00 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1cc10 47 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  G.  if( pPager->
1cc20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
1cc30 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
1cc40 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
1cc50 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46  ger->fd,SQLITE_F
1cc60 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1cc70 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  D,0);.  }.#endif
1cc80 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
1cc90 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65  layback is happe
1cca0 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c  ning automatical
1ccb0 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ly as a result o
1ccc0 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a  f an IO or .  **
1ccd0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68   malloc error th
1cce0 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65  at occurred afte
1ccf0 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  r the change-cou
1cd00 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
1cd10 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72   but .  ** befor
1cd20 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
1cd30 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c  n was committed,
1cd40 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   then the change
1cd50 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d  -counter .  ** m
1cd60 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20  odification may 
1cd70 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72  just have been r
1cd80 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73  everted. If this
1cd90 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c   happens in excl
1cda0 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65  usive .  ** mode
1cdb0 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e  , then subsequen
1cdc0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70  t transactions p
1cdd0 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  erformed by the 
1cde0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20  connection will 
1cdf0 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20  not.  ** update 
1ce00 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1ce10 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20  er at all. This 
1ce20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68  may lead to cach
1ce30 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a  e inconsistency.
1ce40 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f    ** problems fo
1ce50 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  r other processe
1ce60 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  s at some point 
1ce70 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53  in the future. S
1ce80 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20  o, just.  ** in 
1ce90 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61  case this has ha
1cea0 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68  ppened, clear th
1ceb0 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
1cec0 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f  e flag now..  */
1ced0 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
1cee0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
1cef0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
1cf00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cf10 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74  _OK ){.    zMast
1cf20 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
1cf30 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d  pSpace;.    rc =
1cf40 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1cf50 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1cf60 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1cf70 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1cf80 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61  e+1);.    testca
1cf90 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1cfa0 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
1cfb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
1cfc0 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
1cfd0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
1cfe0 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
1cff0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1d000 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72  OPEN).  ){.    r
1d010 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1d020 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b  Sync(pPager, 0);
1d030 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1d040 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d050 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
1d060 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1d070 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27  r, zMaster[0]!='
1d080 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73  \0', 0);.    tes
1d090 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1d0a0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1d0b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d0c0 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
1d0d0 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
1d0e0 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
1d0f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
1d100 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1d110 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
1d120 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
1d130 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
1d140 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
1d150 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
1d160 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
1d170 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
1d180 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1d190 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1d1a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1d1b0 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26   }.  if( isHot &
1d1c0 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20  & nPlayback ){. 
1d1d0 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
1d1e0 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
1d1f0 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22  OVER_ROLLBACK, "
1d200 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61 67  recovered %d pag
1d210 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20  es from %s",.   
1d220 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c               nPl
1d230 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e  ayback, pPager->
1d240 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a  zJournal);.  }..
1d250 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
1d260 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
1d270 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
1d280 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
1d290 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
1d2a0 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
1d2b0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
1d2c0 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
1d2d0 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
1d2e0 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
1d2f0 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
1d300 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
1d310 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
1d320 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
1d330 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1d340 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
1d350 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66  ad the content f
1d360 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20  or page pPg out 
1d370 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d380 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a  file and into .*
1d390 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20  * pPg->pData. A 
1d3a0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67  shared lock or g
1d3b0 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
1d3c0 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
1d3d0 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f  ase.** file befo
1d3e0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1d3f0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
1d400 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72  * If page 1 is r
1d410 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ead, then the va
1d420 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
1d430 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74  ileVers[] is set
1d440 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   to.** the value
1d450 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
1d460 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1d470 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
1d480 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
1d490 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20  the IO error is 
1d4a0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1d4b0 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72  caller..** Other
1d4c0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  wise, SQLITE_OK 
1d4d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1d4e0 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
1d4f0 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  bPage(PgHdr *pPg
1d500 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a 20  , u32 iFrame){. 
1d510 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1d520 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
1d530 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
1d540 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1d550 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
1d560 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
1d570 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
1d580 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
1d590 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1d5a0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1d5b0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1d5c0 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d   */.  int pgsz =
1d5d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1d5e0 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  e; /* Number of 
1d5f0 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
1d600 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1d610 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1d620 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d  R_READER && !MEM
1d630 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1d640 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1d650 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  d) );..#ifndef S
1d660 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
1d670 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20   if( iFrame ){. 
1d680 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c     /* Try to pul
1d690 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  l the page from 
1d6a0 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20  the write-ahead 
1d6b0 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
1d6c0 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46   sqlite3WalReadF
1d6d0 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
1d6e0 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c  l, iFrame, pgsz,
1d6f0 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pPg->pData);.  
1d700 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
1d710 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
1d720 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1d730 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1d740 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
1d750 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1d760 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
1d770 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29  , pgsz, iOffset)
1d780 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1d790 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1d7a0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1d7b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d7c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1d7d0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
1d7e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
1d7f0 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
1d800 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
1d810 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
1d820 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
1d830 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
1d840 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
1d850 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
1d860 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
1d870 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
1d880 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
1d890 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1d8a0 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
1d8b0 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
1d8c0 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
1d8d0 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66  o or the size of
1d8e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1d8f0 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e   page. Bytes 32.
1d900 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20  .35 and 35..39. 
1d910 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62       ** should b
1d920 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77  e page numbers w
1d930 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30  hich are never 0
1d940 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
1d950 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  illing.      ** 
1d960 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d970 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78  rs[] with all 0x
1d980 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ff bytes should 
1d990 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
1d9a0 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
1d9b0 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
1d9c0 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
1d9d0 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
1d9e0 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
1d9f0 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
1da00 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
1da10 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
1da20 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
1da30 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
1da40 69 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69  ite noise equali
1da50 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30  ng 16 bytes of 0
1da60 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67  xff is vanishing
1da70 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20  ly small so.    
1da80 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73    ** we should s
1da90 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20  till be ok..    
1daa0 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65    */.      memse
1dab0 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  t(pPager->dbFile
1dac0 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65  Vers, 0xff, size
1dad0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1dae0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c  eVers));.    }el
1daf0 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62  se{.      u8 *db
1db00 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38  FileVers = &((u8
1db10 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34  *)pPg->pData)[24
1db20 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
1db30 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
1db40 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
1db50 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1db60 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1db70 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31    }.  }.  CODEC1
1db80 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
1db90 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
1dba0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1dbb0 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52 5f  BKPT);..  PAGER_
1dbc0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
1dbd0 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29  er_readdb_count)
1dbe0 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70  ;.  PAGER_INCR(p
1dbf0 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
1dc00 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
1dc10 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1dc20 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45  , pgno));.  PAGE
1dc30 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25  RTRACE(("FETCH %
1dc40 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
1dc50 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1dc60 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1dc70 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
1dc80 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1dc90 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  g)));..  return 
1dca0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64  rc;.}../*.** Upd
1dcb0 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ate the value of
1dcc0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1dcd0 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20 32  ter at offsets 2
1dce0 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74  4 and 92 in.** t
1dcf0 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  he header and th
1dd00 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e  e sqlite version
1dd10 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65   number at offse
1dd20 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t 96..**.** This
1dd30 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69   is an unconditi
1dd40 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65  onal update.  Se
1dd50 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72  e also the pager
1dd60 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1dd70 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ter().** routine
1dd80 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61   which only upda
1dd90 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63  tes the change-c
1dda0 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75 70  ounter if the up
1ddb0 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79  date is actually
1ddc0 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64  .** needed, as d
1ddd0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1dde0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
1ddf0 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76  ountDone state v
1de00 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
1de10 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72  ic void pager_wr
1de20 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
1de30 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  r(PgHdr *pPg){. 
1de40 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
1de50 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  ter;..  /* Incre
1de60 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
1de70 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
1de80 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
1de90 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e  te 24. */.  chan
1dea0 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
1deb0 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
1dec0 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64  *)pPg->pPager->d
1ded0 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20  bFileVers)+1;.  
1dee0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1def0 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34  *)pPg->pData)+24
1df00 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1df10 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74  );..  /* Also st
1df20 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76  ore the SQLite v
1df30 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e  ersion number in
1df40 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e   bytes 96..99 an
1df50 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20  d in.  ** bytes 
1df60 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65  92..95 store the
1df70 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
1df80 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65  for which the ve
1df90 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a  rsion number.  *
1dfa0 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20  * is valid. */. 
1dfb0 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1dfc0 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39  r*)pPg->pData)+9
1dfd0 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  2, change_counte
1dfe0 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  r);.  put32bits(
1dff0 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1e000 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56  ta)+96, SQLITE_V
1e010 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a  ERSION_NUMBER);.
1e020 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1e030 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
1e040 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1e050 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66  s invoked once f
1e060 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61  or each page tha
1e070 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1e080 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  en .** written i
1e090 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  nto the log file
1e0a0 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e   when a WAL tran
1e0b0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1e0c0 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d  d back..** Param
1e0d0 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20  eter iPg is the 
1e0e0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73  page number of s
1e0f0 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43  aid page. The pC
1e100 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  tx argument .** 
1e110 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f  is actually a po
1e120 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
1e130 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  er structure..**
1e140 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20  .** If page iPg 
1e150 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
1e160 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73  e cache, and has
1e170 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1e180 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69  references,.** i
1e190 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20  t is discarded. 
1e1a0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1e1b0 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
1e1c0 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a  ore outstanding.
1e1d0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74  ** references, t
1e1e0 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1e1f0 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d  is reloaded from
1e200 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
1e210 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74  f the.** attempt
1e220 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65   to reload conte
1e230 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1e240 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64  base is required
1e250 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20   and fails, .** 
1e260 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
1e270 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
1e280 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
1e290 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
1e2a0 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1e2b0 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50  ck(void *pCtx, P
1e2c0 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20  gno iPg){.  int 
1e2d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e2e0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1e2f0 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b  = (Pager *)pCtx;
1e300 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
1e310 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
1e320 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
1e330 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33  .  pPg = sqlite3
1e340 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
1e350 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20  er, iPg);.  if( 
1e360 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  pPg ){.    if( s
1e370 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1e380 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31  Refcount(pPg)==1
1e390 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e3a0 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
1e3b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e3c0 20 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20     u32 iFrame = 
1e3d0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
1e3e0 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
1e3f0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
1e400 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61  pPg->pgno, &iFra
1e410 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  me);.      if( r
1e420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e430 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
1e440 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72  dDbPage(pPg, iFr
1e450 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1e460 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e480 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1e490 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  er(pPg);.      }
1e4a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1e4b0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
1e4c0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
1e4d0 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  .  /* Normally, 
1e4e0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1e4f0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
1e500 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63   any backup proc
1e510 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75  esses are.  ** u
1e520 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69  pdated as data i
1e530 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20  s copied out of 
1e540 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1e550 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68  rnal and into th
1e560 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
1e570 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e   This is not gen
1e580 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  erally possible 
1e590 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62  with a WAL datab
1e5a0 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c  ase, as.  ** rol
1e5b0 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73  lback involves s
1e5c0 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67  imply truncating
1e5d0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54   the log file. T
1e5e0 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65  herefore, if one
1e5f0 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72  .  ** or more fr
1e600 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
1e610 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1e620 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74  o the log (and t
1e630 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61  herefore .  ** a
1e640 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  lso copied into 
1e650 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62  the backup datab
1e660 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66  ases) as part of
1e670 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1e680 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b  n,.  ** the back
1e690 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74  ups must be rest
1e6a0 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  arted..  */.  sq
1e6b0 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
1e6c0 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
1e6d0 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  up);..  return r
1e6e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1e6f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1e700 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
1e710 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
1e720 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e   a WAL database.
1e730 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1e740 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
1e750 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1e760 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e780 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
1e790 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1e7a0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1e7b0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1e7c0 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1e7d0 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20  revert */..  /* 
1e7e0 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e  For all pages in
1e7f0 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
1e800 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69  are currently di
1e810 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65  rty or have alre
1e820 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72  ady.  ** been wr
1e830 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63  itten (but not c
1e840 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65  ommitted) to the
1e850 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e   log file, do on
1e860 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66  e of the .  ** f
1e870 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20  ollowing:.  **. 
1e880 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20   **   + Discard 
1e890 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20  the cached page 
1e8a0 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29  (if refcount==0)
1e8b0 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65  , or.  **   + Re
1e8c0 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
1e8d0 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1e8e0 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  ase (if refcount
1e8f0 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  >0)..  */.  pPag
1e900 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1e910 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
1e920 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1e930 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  alUndo(pPager->p
1e940 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61  Wal, pagerUndoCa
1e950 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
1e960 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74  pPager);.  pList
1e970 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1e980 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1e990 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68  ->pPCache);.  wh
1e9a0 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63  ile( pList && rc
1e9b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e9c0 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
1e9d0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
1e9e0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
1e9f0 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69  ndoCallback((voi
1ea00 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  d *)pPager, pLis
1ea10 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  t->pgno);.    pL
1ea20 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d  ist = pNext;.  }
1ea30 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1ea40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1ea50 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
1ea60 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
1ea70 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73  3WalFrames(). As
1ea80 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67   well as logging
1ea90 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
1eaa0 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20   of the list of 
1eab0 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20  pages headed by 
1eac0 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64  pList (connected
1ead0 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20   by pDirty),.** 
1eae0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  this function no
1eaf0 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76  tifies any activ
1eb00 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  e backup process
1eb10 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
1eb20 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65  s have.** change
1eb30 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69  d. .**.** The li
1eb40 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73 73  st of pages pass
1eb50 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75  ed into this rou
1eb60 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73  tine is always s
1eb70 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e 75  orted by page nu
1eb80 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  mber..** Hence, 
1eb90 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61 72  if page 1 appear
1eba0 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  s anywhere on th
1ebb0 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20  e list, it will 
1ebc0 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  be the first pag
1ebd0 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  e..*/ .static in
1ebe0 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  t pagerWalFrames
1ebf0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1ec00 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1ec10 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
1ec20 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ect */.  PgHdr *
1ec30 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
1ec40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1ec50 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f   of frames to lo
1ec60 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75  g */.  Pgno nTru
1ec70 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
1ec80 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1ec90 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  se size after th
1eca0 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69  is commit */.  i
1ecb0 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ecd0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
1ece0 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b  s a commit */.){
1ecf0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1ed20 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74  e */.  int nList
1ed30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ed40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ed50 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69   of pages in pLi
1ed60 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  st */.  PgHdr *p
1ed70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ed80 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1ed90 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65  ooping over page
1eda0 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
1edb0 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a  pPager->pWal );.
1edc0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1edd0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1ede0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
1edf0 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
1ee00 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63 65   list is in acce
1ee10 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
1ee20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20   for(p=pList; p 
1ee30 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d  && p->pDirty; p=
1ee40 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1ee50 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20  assert( p->pgno 
1ee60 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e  < p->pDirty->pgn
1ee70 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  o );.  }.#endif.
1ee80 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1ee90 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69  ->pDirty==0 || i
1eea0 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28  sCommit );.  if(
1eeb0 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20   isCommit ){.   
1eec0 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61   /* If a WAL tra
1eed0 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
1eee0 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  g committed, the
1eef0 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
1ef00 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a  n writing.    **
1ef10 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20   any pages with 
1ef20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
1ef30 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63  ater than nTrunc
1ef40 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c  ate into the WAL
1ef50 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68   file..    ** Th
1ef60 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  ey will never be
1ef70 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69   read by any cli
1ef80 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74  ent. So remove t
1ef90 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69  hem from the pDi
1efa0 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20  rty.    ** list 
1efb0 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48  here. */.    PgH
1efc0 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70  dr **ppNext = &p
1efd0 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20  List;.    nList 
1efe0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  = 0;.    for(p=p
1eff0 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d  List; (*ppNext =
1f000 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69   p)!=0; p=p->pDi
1f010 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rty){.      if( 
1f020 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61  p->pgno<=nTrunca
1f030 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70  te ){.        pp
1f040 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74  Next = &p->pDirt
1f050 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74  y;.        nList
1f060 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1f070 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  }.    assert( pL
1f080 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
1f090 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20      nList = 1;. 
1f0a0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74   }.  pPager->aSt
1f0b0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52  at[PAGER_STAT_WR
1f0c0 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a  ITE] += nList;..
1f0d0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
1f0e0 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69  o==1 ) pager_wri
1f0f0 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1f100 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20  (pList);.  rc = 
1f110 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
1f120 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a  (pPager->pWal, .
1f130 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1f140 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e  geSize, pList, n
1f150 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d  Truncate, isComm
1f160 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  it, pPager->walS
1f170 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20  yncFlags.  );.  
1f180 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f190 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61  K && pPager->pBa
1f1a0 63 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72 28  ckup ){.    for(
1f1b0 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1f1c0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1f1d0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
1f1e0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
1f1f0 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75  kup, p->pgno, (u
1f200 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20  8 *)p->pData);. 
1f210 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
1f220 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1f230 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  GES.  pList = sq
1f240 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
1f250 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
1f260 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ache);.  for(p=p
1f270 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
1f280 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72  irty){.    pager
1f290 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29  _set_pagehash(p)
1f2a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1f2b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f2c0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64  .** Begin a read
1f2d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1f2e0 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54  the WAL..**.** T
1f2f0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64  his routine used
1f300 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70   to be called "p
1f310 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74  agerOpenSnapshot
1f320 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65  ()" because it e
1f330 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61  ssentially.** ma
1f340 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f  kes a snapshot o
1f350 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1f360 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  t the current po
1f370 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20  int in time and 
1f380 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61  preserves.** tha
1f390 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75  t snapshot for u
1f3a0 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72  se by the reader
1f3b0 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e   in spite of con
1f3c0 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65  currently change
1f3d0 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72  s by.** other wr
1f3e0 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f  iters or checkpo
1f3f0 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  inters..*/.stati
1f400 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e  c int pagerBegin
1f410 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1f420 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1f430 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1f460 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65   */.  int change
1f470 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
1f480 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1f490 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72   cache must be r
1f4a0 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eset */..  asser
1f4b0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1f4c0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
1f4d0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1f4e0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
1f4f0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1f500 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
1f510 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57  ;..  /* sqlite3W
1f520 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
1f530 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63  tion() was not c
1f540 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72  alled for the pr
1f550 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e  evious.  ** tran
1f560 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69  saction in locki
1f570 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
1f580 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e  E.  So call it n
1f590 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20  ow.  If we.  ** 
1f5a0 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  are in locking_m
1f5b0 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45  ode=NORMAL and E
1f5c0 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65  ndRead() was pre
1f5d0 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a  viously called,.
1f5e0 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61    ** the duplica
1f5f0 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c  te call is harml
1f600 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
1f610 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1f620 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
1f630 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20  >pWal);..  rc = 
1f640 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52  sqlite3WalBeginR
1f650 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
1f660 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68  Pager->pWal, &ch
1f670 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63  anged);.  if( rc
1f680 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63  !=SQLITE_OK || c
1f690 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61  hanged ){.    pa
1f6a0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1f6b0 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45  );.    if( USEFE
1f6c0 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71  TCH(pPager) ) sq
1f6d0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
1f6e0 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
1f6f0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1f700 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
1f710 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f720 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
1f730 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1f740 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52  ition from PAGER
1f750 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45  _OPEN.** to PAGE
1f760 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74  R_READER state t
1f770 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1f780 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1f790 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20  base file.** in 
1f7a0 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20  pages (assuming 
1f7b0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75  the page size cu
1f7c0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
1f7d0 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  n Pager.pageSize
1f7e0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  )..**.** If no e
1f7f0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
1f800 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1f810 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ed and the size 
1f820 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
1f830 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73  ** in pages is s
1f840 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65  tored in *pnPage
1f850 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
1f860 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68  error code (perh
1f870 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  aps.** SQLITE_IO
1f880 45 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65  ERR_FSTAT) is re
1f890 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61  turned and *pnPa
1f8a0 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ge is left unmod
1f8b0 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
1f8c0 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f   int pagerPageco
1f8d0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
1f8e0 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29  r, Pgno *pnPage)
1f8f0 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20  {.  Pgno nPage; 
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f910 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
1f920 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61  return via *pnPa
1f930 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72  ge */..  /* Quer
1f940 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  y the WAL sub-sy
1f950 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74  stem for the dat
1f960 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20  abase size. The 
1f970 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a  WalDbsize().  **
1f980 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1f990 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41  s zero if the WA
1f9a0 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69  L is not open (i
1f9b0 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d  .e. Pager.pWal==
1f9c0 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74  0), or.  ** if t
1f9d0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1f9e0 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
1f9f0 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  e. The database 
1fa00 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  size is not.  **
1fa10 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
1fa20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
1fa30 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69  em if the log fi
1fa40 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20  le is empty or. 
1fa50 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   ** contains no 
1fa60 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20  valid committed 
1fa70 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20  transactions..  
1fa80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1fa90 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1faa0 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
1fab0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1fac0 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
1fad0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
1fae0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1faf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1fb00 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
1fb10 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71   );.  nPage = sq
1fb20 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70  lite3WalDbsize(p
1fb30 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
1fb40 20 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   /* If the numbe
1fb50 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1fb60 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1fb70 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  t available from
1fb80 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75   the.  ** WAL su
1fb90 62 2d 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d  b-system, determ
1fba0 69 6e 65 20 74 68 65 20 70 61 67 65 20 63 6f 75  ine the page cou
1fbb0 6e 74 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  nte based on the
1fbc0 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68   size of.  ** th
1fbd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1fbe0 20 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66    If the size of
1fbf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fc00 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a  le is not an.  *
1fc10 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  * integer multip
1fc20 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
1fc30 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70 20 74 68  ize, round up th
1fc40 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20  e result..  */. 
1fc50 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26   if( nPage==0 &&
1fc60 20 41 4c 57 41 59 53 28 69 73 4f 70 65 6e 28 70   ALWAYS(isOpen(p
1fc70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20  Pager->fd)) ){. 
1fc80 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20     i64 n = 0;   
1fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fca0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66   /* Size of db f
1fcb0 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
1fcc0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
1fcd0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1fce0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a  Pager->fd, &n);.
1fcf0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fd00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1fd10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1fd20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1fd30 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61  o)((n+pPager->pa
1fd40 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67  geSize-1) / pPag
1fd50 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1fd60 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1fd70 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  current number o
1fd80 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
1fd90 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ile is greater t
1fda0 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  han the.  ** con
1fdb0 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20  figured maximum 
1fdc0 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e  pager number, in
1fdd0 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77  crease the allow
1fde0 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a  ed limit so.  **
1fdf0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
1fe00 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f  an be read..  */
1fe10 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61  .  if( nPage>pPa
1fe20 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
1fe30 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
1fe40 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b  o = (Pgno)nPage;
1fe50 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20  .  }..  *pnPage 
1fe60 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1fe70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1fe80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fe90 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68  MIT_WAL./*.** Ch
1fea0 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c  eck if the *-wal
1feb0 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65   file that corre
1fec0 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61  sponds to the da
1fed0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1fee0 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74   pPager.** exist
1fef0 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  s if the databas
1ff00 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f  e is not empy, o
1ff10 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  r verify that th
1ff20 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65  e *-wal file doe
1ff30 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28  s.** not exist (
1ff40 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20  by deleting it) 
1ff50 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1ff60 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  file is empty..*
1ff70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
1ff80 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74  base is not empt
1ff90 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20  y and the *-wal 
1ffa0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65  file exists, ope
1ffb0 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69  n the pager.** i
1ffc0 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20  n WAL mode.  If 
1ffd0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1ffe0 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a  empty or if no *
1fff0 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  -wal file exists
20000 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72   and.** if no er
20010 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65  ror occurs, make
20020 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72   sure Pager.jour
20030 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73  nalMode is not s
20040 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a  et to.** PAGER_J
20050 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a  OURNALMODE_WAL..
20060 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
20070 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72  ITE_OK or an err
20080 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
20090 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68  he caller must h
200a0 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63  old a SHARED loc
200b0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
200c0 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e file to call t
200d0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  his.** function.
200e0 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c   Because an EXCL
200f0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
20100 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71  e db file is req
20110 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20  uired to delete 
20120 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e  .** a WAL on a n
20130 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61  one-empty databa
20140 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73  se, this ensures
20150 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63   there is no rac
20160 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  e condition .** 
20170 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63  between the xAcc
20180 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20  ess() below and 
20190 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69  an xDelete() bei
201a0 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73  ng executed by s
201b0 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f  ome .** other co
201c0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
201d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
201e0 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61  nWalIfPresent(Pa
201f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20200 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20210 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
20220 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
20230 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
20240 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
20250 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
20260 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
20270 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
20280 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20      int isWal;  
20290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c    /* True if WAL
202b0 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
202c0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
202d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
202f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
20300 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  /..    rc = page
20310 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
20320 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
20330 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
20340 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67  rc;.    if( nPag
20350 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
20360 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
20370 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
20380 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30   pPager->zWal, 0
20390 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
203a0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  =SQLITE_IOERR_DE
203b0 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20  LETE_NOENT ) rc 
203c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
203d0 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20     isWal = 0;.  
203e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
203f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
20400 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70  ess(.          p
20410 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
20420 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54  ger->zWal, SQLIT
20430 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
20440 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b   &isWal.      );
20450 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
20460 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20470 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20        if( isWal 
20480 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
20490 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63  ase( sqlite3Pcac
204a0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
204b0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
204c0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
204d0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
204e0 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  Wal(pPager, 0);.
204f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20500 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
20510 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
20520 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20  ALMODE_WAL ){.  
20530 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
20540 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
20550 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
20560 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LETE;.      }.  
20570 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
20580 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
20590 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61  *.** Playback sa
205a0 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69  vepoint pSavepoi
205b0 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65  nt. Or, if pSave
205c0 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65  point==NULL, the
205d0 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68  n playback.** th
205e0 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
205f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
20600 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e  e case pSavepoin
20610 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77  t==NULL occurs w
20620 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41  hen .** a ROLLBA
20630 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73  CK TO command is
20640 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41   invoked on a SA
20650 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20  VEPOINT that is 
20660 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
20670 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a  * savepoint..**.
20680 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69  ** When pSavepoi
20690 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28  nt is not NULL (
206a0 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72  meaning a non-tr
206b0 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
206c0 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67  int is .** being
206d0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74   rolled back), t
206e0 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
206f0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20   consists of up 
20700 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c  to three stages,
20710 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e  .** performed in
20720 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69   the order speci
20730 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  fied:.**.**   * 
20740 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  Pages are played
20750 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
20760 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
20770 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20  ting at byte.** 
20780 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72      offset Pager
20790 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
207a0 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
207b0 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65   to .**     Page
207c0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
207d0 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65  ffset, or to the
207e0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
207f0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
20800 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76  file if PagerSav
20810 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20820 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  t is zero..**.**
20830 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76     * If PagerSav
20840 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20850 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
20860 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c  hen pages are pl
20870 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b  ayed.**     back
20880 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74   starting from t
20890 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
208a0 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  r immediately fo
208b0 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20  llowing .**     
208c0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
208d0 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65  HdrOffset to the
208e0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   end of the main
208f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
20900 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61  *.**   * Pages a
20910 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62  re then played b
20920 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ack from the sub
20930 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73  -journal file, s
20940 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77  tarting.**     w
20950 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76  ith the PagerSav
20960 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61  epoint.iSubRec a
20970 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
20980 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20   the end of.**  
20990 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
209a0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75  ile..**.** Throu
209b0 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61  ghout the rollba
209c0 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68  ck process, each
209d0 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
209e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
209f0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
20a00 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
20a10 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  a bitvec structu
20a20 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f  re (variable pDo
20a30 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70  ne in the.** imp
20a40 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f  lementation belo
20a50 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  w). This is used
20a60 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
20a70 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a  a page is only.*
20a80 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  * rolled back th
20a90 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20  e first time it 
20aa0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
20ab0 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c  n either journal
20ac0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65  ..**.** If pSave
20ad0 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  point is NULL, t
20ae0 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e  hen pages are on
20af0 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  ly played back f
20b00 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20  rom the main.** 
20b10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
20b20 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
20b30 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74  or a bitvec in t
20b40 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
20b50 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
20b60 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20  before playback 
20b70 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61  commences the Pa
20b80 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61  ger.dbSize varia
20b90 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20  ble.** is reset 
20ba0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61  to the value tha
20bb0 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65  t it held at the
20bc0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61   start of the sa
20bd0 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20  vepoint .** (or 
20be0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f  transaction). No
20bf0 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67   page with a pag
20c00 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e-number greater
20c10 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
20c20 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61  .** is played ba
20c30 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e  ck. If one is en
20c40 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
20c50 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a  simply skipped..
20c60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
20c70 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
20c80 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
20c90 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69  er, PagerSavepoi
20ca0 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b  nt *pSavepoint){
20cb0 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
20cd0 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
20ce0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20cf0 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  l */.  i64 iHdrO
20d00 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
20d10 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20  /* End of first 
20d20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d  segment of main-
20d30 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
20d40 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
20d50 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
20d60 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
20d70 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20    Bitvec *pDone 
20d80 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69  = 0;       /* Bi
20d90 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70  tvec to ensure p
20da0 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b  ages played back
20db0 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20   only once */.. 
20dc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20dd0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
20de0 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
20df0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20e00 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
20e10 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41  OCKED );..  /* A
20e20 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63  llocate a bitvec
20e30 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65   to use to store
20e40 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   the set of page
20e50 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f  s rolled back */
20e60 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
20e70 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d  t ){.    pDone =
20e80 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
20e90 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d  eate(pSavepoint-
20ea0 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28  >nOrig);.    if(
20eb0 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20   !pDone ){.     
20ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
20ed0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
20ee0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
20ef0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
20f00 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
20f10 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65  ue it was before
20f20 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
20f30 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72    ** being rever
20f40 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  ted was opened..
20f50 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
20f60 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69  bSize = pSavepoi
20f70 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt ? pSavepoint-
20f80 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d  >nOrig : pPager-
20f90 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70  >dbOrigSize;.  p
20fa0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
20fb0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
20fc0 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
20fd0 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26  ( !pSavepoint &&
20fe0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
20ff0 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
21000 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  rn pagerRollback
21010 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Wal(pPager);.  }
21020 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
21030 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
21040 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
21050 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
21060 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
21070 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
21080 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
21090 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
210a0 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
210b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
210c0 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
210d0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
210e0 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
210f0 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
21100 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
21110 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
21120 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
21130 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21140 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ff;.  assert( pa
21150 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
21160 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  )==0 || szJ==0 )
21170 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
21180 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
21190 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  cords from the m
211a0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
211b0 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67  ting at.  ** Pag
211c0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
211d0 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
211e0 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a  ng to the next j
211f0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
21200 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20   ** There might 
21210 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  be records in th
21220 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74  e main journal t
21230 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20  hat have a page 
21240 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61  number.  ** grea
21250 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
21260 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69  rent database si
21270 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ze (pPager->dbSi
21280 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20  ze) but those.  
21290 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
212a0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
212b0 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64  .  Pages are add
212c0 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74  ed to pDone as t
212d0 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61  hey.  ** are pla
212e0 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
212f0 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
21300 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  && !pagerUseWal(
21310 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69  pPager) ){.    i
21320 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  HdrOff = pSavepo
21330 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
21340 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  ? pSavepoint->iH
21350 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a  drOffset : szJ;.
21360 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
21370 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  nalOff = pSavepo
21380 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  int->iOffset;.  
21390 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
213a0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
213b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64  ->journalOff<iHd
213c0 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63  rOff ){.      rc
213d0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
213e0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
213f0 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
21400 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
21410 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
21420 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21430 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c  TE_DONE );.  }el
21440 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
21450 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
21460 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e    }..  /* Contin
21470 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ue rolling back 
21480 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74  records out of t
21490 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
214a0 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
214b0 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
214c0 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61  al header seen a
214d0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e  nd continuing un
214e0 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76  til the effectiv
214f0 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  e end.  ** of th
21500 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
21510 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  ile.  Continue t
21520 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61  o skip out-of-ra
21530 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20  nge pages and.  
21540 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69  ** continue addi
21550 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  ng pages rolled 
21560 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20  back to pDone.. 
21570 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   */.  while( rc=
21580 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
21590 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
215a0 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20  <szJ ){.    u32 
215b0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
215c0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
215d0 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20  /.    u32 nJRec 
215e0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
215f0 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
21600 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
21610 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
21620 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
21630 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20  pPager, 0, szJ, 
21640 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
21650 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
21660 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
21670 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
21680 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72  he "pPager->jour
21690 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
216a0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
216b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
216c0 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69  f".    ** test i
216d0 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63  s related to tic
216e0 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20  ket #2565.  See 
216f0 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69  the discussion i
21700 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
21710 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75  er_playback() fu
21720 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  nction for addit
21730 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
21740 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
21750 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20  ( nJRec==0 .    
21760 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
21770 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
21780 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
21790 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
217a0 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e  f.    ){.      n
217b0 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a  JRec = (u32)((sz
217c0 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
217d0 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f  nalOff)/JOURNAL_
217e0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
217f0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
21800 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
21810 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26  K && ii<nJRec &&
21820 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21830 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a  Off<szJ; ii++){.
21840 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
21850 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
21860 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
21870 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
21880 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
21890 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
218a0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
218b0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
218c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
218d0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
218e0 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff>=szJ );..  
218f0 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c  /* Finally,  rol
21900 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d  lback pages from
21910 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
21920 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72  .  Page that wer
21930 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  e.  ** previousl
21940 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75  y rolled back ou
21950 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
21960 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68  urnal (and are h
21970 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20  ence in pDone). 
21980 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
21990 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e  ped.  Out-of-ran
219a0 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73  ge pages are als
219b0 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  o skipped..  */.
219c0 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
219d0 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
219e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
219f0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
21a00 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
21a10 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e  i64)pSavepoint->
21a20 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  iSubRec*(4+pPage
21a30 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
21a40 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
21a50 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
21a60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21a70 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f  WalSavepointUndo
21a80 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
21a90 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44  Savepoint->aWalD
21aa0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata);.    }.    
21ab0 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e  for(ii=pSavepoin
21ac0 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d  t->iSubRec; rc==
21ad0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
21ae0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b  pPager->nSubRec;
21af0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
21b00 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 28 69  sert( offset==(i
21b10 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65 72 2d  64)ii*(4+pPager-
21b20 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20  >pageSize) );.  
21b30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
21b40 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
21b50 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74  (pPager, &offset
21b60 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a  , pDone, 0, 1);.
21b70 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21b80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21b90 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  E );.  }..  sqli
21ba0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
21bb0 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72  (pDone);.  if( r
21bc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21bd0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
21be0 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
21bf0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
21c00 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
21c10 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
21c20 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
21c30 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
21c40 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65  llowed.** before
21c50 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
21c60 65 63 79 63 6c 65 20 63 6c 65 61 6e 20 61 6e 64  ecycle clean and
21c70 20 75 6e 75 73 65 64 20 70 61 67 65 73 2e 0a 2a   unused pages..*
21c80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
21c90 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
21ca0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
21cb0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71  nt mxPage){.  sq
21cc0 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61  lite3PcacheSetCa
21cd0 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
21ce0 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29  pPCache, mxPage)
21cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
21d00 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
21d10 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
21d20 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
21d30 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f   allowed.** befo
21d40 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
21d50 20 73 70 69 6c 6c 20 70 61 67 65 73 20 74 6f 20   spill pages to 
21d60 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
21d70 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
21d80 70 69 6c 6c 73 69 7a 65 28 50 61 67 65 72 20 2a  pillsize(Pager *
21d90 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
21da0 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ge){.  return sq
21db0 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 53 70  lite3PcacheSetSp
21dc0 69 6c 6c 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  illsize(pPager->
21dd0 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29  pPCache, mxPage)
21de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
21df0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  e SQLITE_FCNTL_M
21e00 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f  MAP_SIZE based o
21e10 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
21e20 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a  lue of szMmap..*
21e30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
21e40 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50  gerFixMaplimit(P
21e50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23  ager *pPager){.#
21e60 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
21e70 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69  AP_SIZE>0.  sqli
21e80 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70  te3_file *fd = p
21e90 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28  Pager->fd;.  if(
21ea0 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20 66   isOpen(fd) && f
21eb0 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
21ec0 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20  rsion>=3 ){.    
21ed0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
21ee0 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65  ;.    sz = pPage
21ef0 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70  r->szMmap;.    p
21f00 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68  Pager->bUseFetch
21f10 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73   = (sz>0);.    s
21f20 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
21f30 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
21f40 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
21f50 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29  _MMAP_SIZE, &sz)
21f60 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
21f70 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
21f80 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66   maximum size of
21f90 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70   any memory mapp
21fa0 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20  ing made of the 
21fb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21fc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
21fd0 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
21fe0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73  Pager *pPager, s
21ff0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
22000 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  map){.  pPager->
22010 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b  szMmap = szMmap;
22020 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69  .  pagerFixMapli
22030 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  mit(pPager);.}..
22040 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75  /*.** Free as mu
22050 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
22060 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70  sible from the p
22070 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ager..*/.void sq
22080 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b  lite3PagerShrink
22090 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
220a0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
220b0 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70  Shrink(pPager->p
220c0 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
220d0 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67  * Adjust setting
220e0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74  s of the pager t
220f0 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  o those specifie
22100 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73  d in the pgFlags
22110 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
22120 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e  * The "level" in
22130 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
22140 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53  _SYNCHRONOUS_MAS
22150 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73  K sets the robus
22160 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tness.** of the 
22170 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
22180 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
22190 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61  shes or power fa
221a0 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61  ilures by.** cha
221b0 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
221c0 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
221d0 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  n writing the jo
221e0 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65  urnals..** There
221f0 20 61 72 65 20 66 6f 75 72 20 6c 65 76 65 6c 73   are four levels
22200 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
22210 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
22220 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
22230 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
22240 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
22250 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
22260 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
22270 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
22280 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
22290 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
222a0 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
222b0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
222c0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
222d0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
222e0 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
222f0 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
22300 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
22310 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
22320 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
22330 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
22340 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
22350 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22360 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
22370 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
22380 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
22390 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
223a0 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
223b0 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
223c0 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
223d0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
223f0 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
22400 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
22410 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
22420 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
22430 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
22440 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
22450 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
22460 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
22470 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
22480 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
22490 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
224a0 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
224b0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
224c0 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
224d0 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
224e0 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
224f0 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
22500 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
22510 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
22520 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
22530 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
22540 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
22550 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
22560 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
22570 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
22580 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
22590 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
225a0 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
225b0 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
225c0 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
225d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
225e0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
225f0 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41 20 20  **.**    EXTRA  
22600 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20     This is like 
22610 46 55 4c 4c 20 65 78 63 65 70 74 20 74 68 61 74  FULL except that
22620 20 69 73 20 61 6c 73 6f 20 73 79 6e 63 73 20 74   is also syncs t
22630 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
22640 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
22650 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  t contains the r
22660 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
22670 61 66 74 65 72 20 74 68 65 20 72 6f 6c 6c 62 61  after the rollba
22680 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ck.**           
22690 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 6e     journal is un
226a0 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  linked..**.** Th
226b0 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61  e above is for a
226c0 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
226d0 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c  l mode.  For WAL
226e0 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69   mode, OFF conti
226f0 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20  nues.** to mean 
22700 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76  that no syncs ev
22710 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41  er occur.  NORMA
22720 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
22730 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a   WAL is synced.*
22740 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  * prior to the s
22750 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69  tart of checkpoi
22760 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  nt and that the 
22770 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
22780 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68   synced.** at th
22790 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
227a0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
227b0 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  f the entire con
227c0 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a  tent of the WAL.
227d0 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62  ** was written b
227e0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
227f0 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73  abase.  But no s
22800 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  ync operations o
22810 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f  ccur for.** an o
22820 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69  rdinary commit i
22830 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69  n NORMAL mode wi
22840 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65  th WAL.  FULL me
22850 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c  ans that the WAL
22860 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63  .** file is sync
22870 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ed following eac
22880 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69  h commit operati
22890 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20  on, in addition 
228a0 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20  to the.** syncs 
228b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
228c0 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65 20 69  NORMAL.  There i
228d0 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
228e0 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a 20  between FULL.** 
228f0 61 6e 64 20 45 58 54 52 41 20 66 6f 72 20 57 41  and EXTRA for WA
22900 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f  L mode..**.** Do
22910 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e   not confuse syn
22920 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69  chronous=FULL wi
22930 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  th SQLITE_SYNC_F
22940 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  ULL.  The.** SQL
22950 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61  ITE_SYNC_FULL ma
22960 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65  cro means to use
22970 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c   the MacOSX-styl
22980 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20  e full-fsync.** 
22990 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55  using fcntl(F_FU
229a0 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54  LLFSYNC).  SQLIT
229b0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65  E_SYNC_NORMAL me
229c0 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20  ans to do an.** 
229d0 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29  ordinary fsync()
229e0 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73   call.  There is
229f0 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62   no difference b
22a00 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59  etween SQLITE_SY
22a10 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53  NC_FULL.** and S
22a20 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22a30 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f  L on platforms o
22a40 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58  ther than MacOSX
22a50 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79  .  But the.** sy
22a60 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76  nchronous=FULL v
22a70 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75  ersus synchronou
22a80 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67  s=NORMAL setting
22a90 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e   determines when
22aa0 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72  .** the xSync pr
22ab0 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65  imitive is calle
22ac0 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e  d and is relevan
22ad0 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72  t to all platfor
22ae0 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ms..**.** Numeri
22af0 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
22b00 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
22b10 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
22b20 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
22b30 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
22b40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22b50 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
22b60 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
22b70 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67  rSetFlags(.  Pag
22b80 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
22b90 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
22ba0 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65  to set safety le
22bb0 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73  vel for */.  uns
22bc0 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20  igned pgFlags   
22bd0 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c     /* Various fl
22be0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  ags */.){.  unsi
22bf0 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46  gned level = pgF
22c00 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e  lags & PAGER_SYN
22c10 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20  CHRONOUS_MASK;. 
22c20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
22c30 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61  pFile ){.    pPa
22c40 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b  ger->noSync = 1;
22c50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
22c60 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  lSync = 0;.    p
22c70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63  Pager->extraSync
22c80 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
22c90 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e     pPager->noSyn
22ca0 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47 45  c =  level==PAGE
22cb0 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46  R_SYNCHRONOUS_OF
22cc0 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67  F ?1:0;.    pPag
22cd0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
22ce0 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e 43  evel>=PAGER_SYNC
22cf0 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31 3a  HRONOUS_FULL ?1:
22d00 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
22d10 78 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65 6c  xtraSync = level
22d20 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  ==PAGER_SYNCHRON
22d30 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b 0a  OUS_EXTRA ?1:0;.
22d40 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
22d50 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
22d60 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
22d70 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  s = 0;.    pPage
22d80 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
22d90 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
22da0 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
22db0 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20  R_FULLFSYNC ){. 
22dc0 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
22dd0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
22de0 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61  NC_FULL;.    pPa
22df0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
22e00 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22e10 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69  _FULL;.  }else i
22e20 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
22e30 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
22e40 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  C ){.    pPager-
22e50 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
22e60 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
22e70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
22e80 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
22e90 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
22ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
22eb0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
22ec0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22ed0 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
22ee0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
22ef0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22f00 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  AL;.  }.  pPager
22f10 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d  ->walSyncFlags =
22f20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
22f30 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  gs;.  if( pPager
22f40 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
22f50 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
22f60 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59  cFlags |= WAL_SY
22f70 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b  NC_TRANSACTIONS;
22f80 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61  .  }.  if( pgFla
22f90 67 73 20 26 20 50 41 47 45 52 5f 43 41 43 48 45  gs & PAGER_CACHE
22fa0 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61  SPILL ){.    pPa
22fb0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
22fc0 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  &= ~SPILLFLAG_OF
22fd0 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  F;.  }else{.    
22fe0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
22ff0 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f  ll |= SPILLFLAG_
23000 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  OFF;.  }.}.#endi
23010 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
23020 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
23030 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
23040 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
23050 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
23060 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
23070 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
23080 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
23090 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
230a0 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
230b0 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
230c0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
230d0 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
230e0 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
230f0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
23100 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
23110 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
23120 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
23130 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
23140 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
23150 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
23160 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
23170 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
23180 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
23190 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
231a0 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
231b0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
231c0 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
231d0 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
231e0 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
231f0 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
23200 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
23210 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
23220 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
23230 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
23240 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
23250 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
23260 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
23270 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
23280 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
23290 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
232a0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
232b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
232c0 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
232d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
232e0 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
232f0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
23300 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
23310 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
23320 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
23330 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
23340 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
23350 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
23360 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
23370 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
23380 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
23390 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
233a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
233b0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
233c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
233d0 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
233e0 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
233f0 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
23400 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
23410 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
23420 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
23430 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
23440 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
23450 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
23460 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
23470 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
23480 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
23490 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
234a0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
234b0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
234c0 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
234d0 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
234e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
234f0 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
23500 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
23510 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
23520 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
23530 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
23540 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
23550 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
23560 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
23570 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
23580 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
23590 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
235a0 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
235b0 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
235c0 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
235d0 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
235e0 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
235f0 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
23600 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
23610 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
23620 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
23630 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
23640 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
23650 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
23660 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
23670 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
23680 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
23690 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
236a0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
236b0 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
236c0 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
236d0 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
236e0 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
236f0 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
23700 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
23710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
23740 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
23750 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
23760 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
23770 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
23780 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
23790 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
237a0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
237b0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
237c0 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
237d0 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
237e0 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
237f0 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
23800 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
23810 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
23820 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
23830 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
23840 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
23850 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
23860 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
23870 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
23880 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
23890 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
238a0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
238b0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
238c0 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
238d0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238f0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
23900 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
23910 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
23920 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
23930 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
23940 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
23950 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
23960 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
23970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
23980 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
23990 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
239a0 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42  .){.  pPager->xB
239b0 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
239c0 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61  syHandler;.  pPa
239d0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
239e0 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64  rArg = pBusyHand
239f0 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69  lerArg;..  if( i
23a00 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
23a10 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a  ) ){.    void **
23a20 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70  ap = (void **)&p
23a30 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
23a40 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ler;.    assert(
23a50 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a   ((int(*)(void *
23a60 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73  ))(ap[0]))==xBus
23a70 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20  yHandler );.    
23a80 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70  assert( ap[1]==p
23a90 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29  BusyHandlerArg )
23aa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
23ab0 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
23ac0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
23ad0 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44  E_FCNTL_BUSYHAND
23ae0 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29  LER, (void *)ap)
23af0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
23b00 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
23b10 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
23b20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
23b30 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
23b40 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
23b50 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
23b60 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
23b70 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
23b80 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
23b90 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
23ba0 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
23bb0 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
23bc0 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
23bd0 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
23be0 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
23bf0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
23c00 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f  OERR, an SQLITE_
23c10 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f  IOERR_xxx sub-co
23c20 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  de or SQLITE_FUL
23c30 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
23c40 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
23c50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
23c60 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
23c70 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
23c80 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
23c90 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
23ca0 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
23cb0 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
23cc0 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
23cd0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
23ce0 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
23cf0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
23d00 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
23d10 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
23d20 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
23d30 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
23d40 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
23d50 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
23d60 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
23d70 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
23d80 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
23d90 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
23da0 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
23db0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
23dc0 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
23dd0 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
23de0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
23df0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
23e00 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
23e10 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
23e20 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
23e30 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
23e40 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
23e50 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
23e60 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
23e70 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
23e80 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
23e90 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
23ea0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
23eb0 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
23ec0 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
23ed0 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
23ee0 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
23ef0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
23f00 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
23f10 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
23f20 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
23f30 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
23f40 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
23f50 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
23f60 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
23f70 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
23f80 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
23f90 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
23fa0 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
23fb0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
23fc0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
23fd0 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
23fe0 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
23ff0 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
24000 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
24010 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
24020 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
24030 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
24040 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
24050 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65  , u32 *pPageSize
24060 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
24070 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24080 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20  TE_OK;..  /* It 
24090 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
240a0 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73  to do a full ass
240b0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
240c0 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a  ) here, as this.
240d0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61    ** function ma
240e0 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  y be called from
240f0 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65   within PagerOpe
24100 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20  n(), before the 
24110 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68  state.  ** of th
24120 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e Pager object i
24130 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e  s internally con
24140 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  sistent..  **.  
24150 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  ** At one point 
24160 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
24170 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
24180 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  if the pager was
24190 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f   in .  ** PAGER_
241a0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74  ERROR state. But
241b0 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52   since PAGER_ERR
241c0 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74  OR state guarant
241d0 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ees that.  ** th
241e0 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  ere is at least 
241f0 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
24200 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20  page reference, 
24210 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
24220 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  ** is a no-op fo
24230 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68  r that case anyh
24240 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20  ow..  */..  u32 
24250 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
24260 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
24270 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
24280 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
24290 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
242a0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
242b0 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  ) );.  if( (pPag
242c0 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
242d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
242e0 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  0).   && sqlite3
242f0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
24300 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
24310 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69  =0 .   && pageSi
24320 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
24330 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
24340 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20  eSize .  ){.    
24350 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c  char *pNew = NUL
24360 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  L;             /
24370 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65  * New temp space
24380 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74   */.    i64 nByt
24390 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  e = 0;..    if( 
243a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
243b0 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f  AGER_OPEN && isO
243c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
243d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
243e0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
243f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79  pPager->fd, &nBy
24400 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  te);.    }.    i
24410 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24420 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
24430 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
24440 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
24450 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
24460 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c  !pNew ) rc = SQL
24470 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
24480 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
24490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
244a0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
244b0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
244c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
244d0 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
244e0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
244f0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
24500 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24520 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
24530 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
24540 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
24550 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e  ->pTmpSpace = pN
24560 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ew;.      pPager
24570 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f  ->dbSize = (Pgno
24580 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a  )((nByte+pageSiz
24590 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a  e-1)/pageSize);.
245a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
245b0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
245c0 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
245d0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
245e0 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d  ree(pNew);.    }
245f0 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69  .  }..  *pPageSi
24600 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
24610 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d  eSize;.  if( rc=
24620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24630 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
24640 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
24650 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
24660 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
24670 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
24680 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
24690 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
246a0 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
246b0 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
246c0 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
246d0 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69     pagerFixMapli
246e0 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
246f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24700 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
24710 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
24720 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
24730 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
24740 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
24750 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
24760 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
24770 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
24780 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
24790 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
247a0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
247b0 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
247c0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
247d0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
247e0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
247f0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
24800 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
24810 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
24820 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
24830 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
24840 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
24850 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
24860 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
24870 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
24880 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
24890 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
248a0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
248b0 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
248c0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
248d0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
248e0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
248f0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
24900 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
24910 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
24920 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
24930 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
24940 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
24950 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
24960 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
24970 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
24980 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
24990 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
249a0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
249b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
249c0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
249d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
249e0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
249f0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
24a00 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
24a10 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
24a20 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
24a30 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
24a40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24a50 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
24a60 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a  _OPEN );      /*
24a70 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20   Called only by 
24a80 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20  OP_MaxPgcnt */. 
24a90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24aa0 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d  >mxPgno>=pPager-
24ab0 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f  >dbSize );  /* O
24ac0 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72  P_MaxPgcnt enfor
24ad0 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65  ces this */.  re
24ae0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
24af0 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
24b00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
24b10 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
24b20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
24b30 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
24b40 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
24b50 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
24b60 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
24b70 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
24b80 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
24b90 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
24ba0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
24bb0 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
24bc0 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
24bd0 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
24be0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
24bf0 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
24c00 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
24c10 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
24c20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
24c30 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
24c40 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
24c50 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
24c60 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
24c70 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
24c80 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
24c90 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
24ca0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
24cb0 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
24cc0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
24cd0 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
24ce0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
24cf0 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
24d00 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
24d10 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
24d20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
24d30 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
24d40 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
24d50 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
24d60 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
24d70 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
24d80 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
24d90 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
24da0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
24db0 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
24dc0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
24dd0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
24de0 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
24df0 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
24e00 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
24e10 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
24e20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
24e30 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
24e40 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
24e50 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
24e60 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
24e70 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
24e80 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
24e90 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
24ea0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
24eb0 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
24ec0 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
24ed0 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
24ee0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
24ef0 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
24f00 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
24f10 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
24f20 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
24f30 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
24f40 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
24f50 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
24f60 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
24f70 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
24f80 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
24f90 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
24fa0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
24fb0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
24fc0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
24fd0 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
24fe0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
24ff0 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
25000 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
25010 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
25020 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
25030 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
25040 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
25050 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
25060 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25070 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
25080 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
25090 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
250a0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
250b0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
250c0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
250d0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
250e0 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
250f0 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
25100 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
25110 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
25120 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
25130 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
25140 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
25150 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
25160 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
25170 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
25180 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
25190 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
251a0 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
251b0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
251c0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
251d0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
251e0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
251f0 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
25200 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
25210 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
25220 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
25230 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25240 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
25250 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25260 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
25270 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
25280 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
25290 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
252a0 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
252b0 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
252c0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
252d0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
252e0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
252f0 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
25300 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
25310 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
25320 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
25330 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
25340 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
25350 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
25360 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
25370 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
25380 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
25390 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
253a0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
253b0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
253c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
253d0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
253e0 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
253f0 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
25400 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
25410 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
25420 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
25430 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
25440 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
25450 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
25460 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
25470 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
25480 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
25490 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
254a0 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
254b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
254c0 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
254d0 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
254e0 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
254f0 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
25500 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
25510 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
25520 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
25530 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
25540 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
25550 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
25560 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
25570 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
25580 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
25590 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
255a0 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
255b0 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
255c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
255d0 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
255e0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
255f0 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
25600 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
25610 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
25620 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
25630 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
25640 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
25650 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
25660 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
25670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25680 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
25690 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
256a0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
256b0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
256c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
256e0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
256f0 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
25700 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
25710 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
25720 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
25730 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
25740 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  eld), or one of 
25750 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  the transitions 
25760 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
25770 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
25780 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
25790 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
257a0 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
257b0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
257c0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
257d0 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
257e0 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
257f0 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
25800 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
25810 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
25820 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
25830 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
25840 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
25850 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
25860 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
25870 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
25880 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
25890 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
258a0 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
258b0 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
258c0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
258d0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
258e0 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
258f0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
25900 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25910 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
25920 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25930 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
25940 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
25950 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
25960 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
25970 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
25980 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
25990 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
259a0 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
259b0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
259c0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
259d0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
259e0 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
259f0 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
25a00 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
25a10 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
25a20 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
25a30 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
25a40 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
25a50 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
25a60 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
25a70 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
25a80 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
25a90 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
25aa0 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
25ab0 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
25ac0 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
25ad0 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
25ae0 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
25af0 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
25b00 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
25b10 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
25b20 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
25b30 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
25b40 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
25b50 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
25b60 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
25b70 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
25b80 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
25b90 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
25ba0 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
25bb0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
25bc0 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
25bd0 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
25be0 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
25bf0 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
25c00 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
25c10 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f  rect behavior wo
25c20 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72  uld be to restor
25c30 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  e the current.**
25c40 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
25c50 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73  page. However, s
25c60 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e  ince this conten
25c70 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
25c80 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68   in either.** th
25c90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25ca0 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f  or the portion o
25cb0 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
25cc0 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73  ournal and .** s
25cd0 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65  ub-journal rolle
25ce0 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65  d back the conte
25cf0 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  nt could not be 
25d00 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65  restored and the
25d10 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61  .** database ima
25d20 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20  ge would become 
25d30 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74  corrupt. It is t
25d40 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61  herefore fortuna
25d50 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73  te that .** this
25d60 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61   circumstance ca
25d70 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23  nnot arise..*/.#
25d80 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
25d90 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
25da0 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
25db0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28  ateConstraintCb(
25dc0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61  PgHdr *pPg){.  a
25dd0 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
25de0 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
25df0 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a  .  assert( !subj
25e00 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
25e10 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d  ) || pPg->pgno<=
25e20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53  pPg->pPager->dbS
25e30 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ize );.}.static 
25e40 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
25e50 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61  ateConstraint(Pa
25e60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
25e70 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
25e80 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
25e90 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72  ->pPCache, asser
25ea0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
25eb0 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a  intCb);.}.#else.
25ec0 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54  # define assertT
25ed0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25ee0 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66  t(pPager).#endif
25ef0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
25f00 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
25f10 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
25f20 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
25f30 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
25f40 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
25f50 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
25f60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25f70 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
25f80 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
25f90 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
25fa0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
25fb0 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
25fc0 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
25fd0 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
25fe0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
25ff0 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
26000 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
26010 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
26020 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
26030 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
26040 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
26050 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74   Once this funct
26060 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ion has been cal
26070 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63  led, the transac
26080 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72  tion must either
26090 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61   be.** rolled ba
260a0 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e  ck or committed.
260b0 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
260c0 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
260d0 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65  ction and.** the
260e0 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69  n continue writi
260f0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
26100 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
26110 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
26120 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
26130 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
26140 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
26150 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
26160 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
26170 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
26180 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
26190 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72  EMOD );.  pPager
261a0 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
261b0 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70  ;..  /* At one p
261c0 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65  oint the code he
261d0 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74  re called assert
261e0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
261f0 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73  nt() to.  ** ens
26200 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ure that all pag
26210 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74  es being truncat
26220 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20  ed away by this 
26230 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20  operation are,. 
26240 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f   ** if one or mo
26250 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  re savepoints ar
26260 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20  e open, present 
26270 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  in the savepoint
26280 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73   .  ** journal s
26290 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
262a0 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74  be restored if t
262b0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
262c0 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
262d0 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e  . This is no lon
262e0 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73  ger necessary as
262f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26300 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20  s now only.  ** 
26310 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
26320 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
26330 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f   transaction. So
26340 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20   although the . 
26350 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   ** Pager object
26360 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20   may still have 
26370 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
26380 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
26390 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65  t!=0), .  ** the
263a0 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  y cannot be roll
263b0 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20  ed back. So the 
263c0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
263d0 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a  nstraint() call.
263e0 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65    ** is no longe
263f0 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a  r correct. */.}.
26400 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
26410 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
26420 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
26430 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
26440 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20  rollback. It.** 
26450 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
26460 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20  l file to disk, 
26470 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72  then sets pPager
26480 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  ->journalHdr to 
26490 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
264a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
264b0 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
264c0 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
264d0 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68  tine knows.** th
264e0 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  at the entire jo
264f0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62  urnal file has b
26500 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a  een synced..**.*
26510 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d  * Syncing a hot-
26520 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20  journal to disk 
26530 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
26540 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
26550 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68  k ensures .** th
26560 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61  at if a power-fa
26570 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72  ilure occurs dur
26580 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
26590 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  , the process th
265a0 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72  at.** attempts r
265b0 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
265c0 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72  g system recover
265d0 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20  y sees the same 
265e0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65  journal.** conte
265f0 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65  nt as this proce
26600 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ss..**.** If eve
26610 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20  rything goes as 
26620 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f  planned, SQLITE_
26630 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
26640 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61  Otherwise, .** a
26650 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
26660 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
26670 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  nt pagerSyncHotJ
26680 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
26690 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
266a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
266b0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
266c0 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
266d0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
266e0 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
266f0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
26700 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
26710 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
26720 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
26730 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
26740 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
26750 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  alHdr);.  }.  re
26760 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26770 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72  * Obtain a refer
26780 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79  ence to a memory
26790 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f 62 6a   mapped page obj
267a0 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  ect for page num
267b0 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68  ber pgno. .** Th
267c0 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c  e new object wil
267d0 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e 74 65  l use the pointe
267e0 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69 6e 65  r pData, obtaine
267f0 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28 29 2e  d from xFetch().
26800 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
26810 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65 20 74  l, set *ppPage t
26820 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
26830 65 77 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ew page referenc
26840 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20  e.** and return 
26850 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
26860 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
26870 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
26880 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70  e and set.** *pp
26890 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  Page to zero..**
268a0 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72 65 6e  .** Page referen
268b0 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20  ces obtained by 
268c0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
268d0 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
268e0 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20 63  released.** by c
268f0 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65 6c 65  alling pagerRele
26900 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f  aseMapPage()..*/
26910 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
26920 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
26930 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
26940 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26950 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
26960 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ct */.  Pgno pgn
26970 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
26980 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
26990 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64  number */.  void
269a0 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20   *pData,        
269b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
269c0 46 65 74 63 68 28 29 27 64 20 64 61 74 61 20 66  Fetch()'d data f
269d0 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
269e0 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67 65    PgHdr **ppPage
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a00 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69 72    /* OUT: Acquir
26a10 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 2a  ed page object *
26a20 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  /.){.  PgHdr *p;
26a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a40 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
26a50 20 6d 61 70 70 65 64 20 70 61 67 65 20 74 6f 20   mapped page to 
26a60 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a 20 20 69  return */.  .  i
26a70 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  f( pPager->pMmap
26a80 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20  Freelist ){.    
26a90 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70 50  *ppPage = p = pP
26aa0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
26ab0 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ist;.    pPager-
26ac0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
26ad0 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
26ae0 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
26af0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
26b00 72 2d 3e 6e 45 78 74 72 61 3e 3d 38 20 29 3b 0a  r->nExtra>=8 );.
26b10 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45      memset(p->pE
26b20 78 74 72 61 2c 20 30 2c 20 38 29 3b 0a 20 20 7d  xtra, 0, 8);.  }
26b30 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
26b40 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a  e = p = (PgHdr *
26b50 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
26b60 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29  ro(sizeof(PgHdr)
26b70 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
26b80 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  a);.    if( p==0
26b90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26ba0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
26bb0 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
26bc0 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
26bd0 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
26be0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
26bf0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
26c00 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45  .    }.    p->pE
26c10 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26  xtra = (void *)&
26c20 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  p[1];.    p->fla
26c30 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b  gs = PGHDR_MMAP;
26c40 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
26c50 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20  ;.    p->pPager 
26c60 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20  = pPager;.  }.. 
26c70 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74   assert( p->pExt
26c80 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31  ra==(void *)&p[1
26c90 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
26ca0 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ->pPage==0 );.  
26cb0 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73  assert( p->flags
26cc0 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a  ==PGHDR_MMAP );.
26cd0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
26ce0 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
26cf0 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
26d00 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e  ==1 );..  p->pgn
26d10 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70  o = pgno;.  p->p
26d20 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20  Data = pData;.  
26d30 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
26d40 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ++;..  return SQ
26d50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
26d60 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65  * Release a refe
26d70 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50  rence to page pP
26d80 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65  g. pPg must have
26d90 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62   been returned b
26da0 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72  y an .** earlier
26db0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63   call to pagerAc
26dc0 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a  quireMapPage()..
26dd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
26de0 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
26df0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
26e00 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
26e10 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
26e20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
26e30 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72  t--;.  pPg->pDir
26e40 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d  ty = pPager->pMm
26e50 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50  apFreelist;.  pP
26e60 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
26e70 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73  ist = pPg;..  as
26e80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64  sert( pPager->fd
26e90 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
26ea0 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c  sion>=3 );.  sql
26eb0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
26ec0 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
26ed0 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61  pPg->pgno-1)*pPa
26ee0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
26ef0 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f  Pg->pData);.}../
26f00 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67  *.** Free all Pg
26f10 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72  Hdr objects stor
26f20 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ed in the Pager.
26f30 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69  pMmapFreelist li
26f40 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
26f50 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  id pagerFreeMapH
26f60 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  drs(Pager *pPage
26f70 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  r){.  PgHdr *p;.
26f80 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a    PgHdr *pNext;.
26f90 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
26fa0 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70  pMmapFreelist; p
26fb0 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
26fc0 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74  pNext = p->pDirt
26fd0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  y;.    sqlite3_f
26fe0 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ree(p);.  }.}...
26ff0 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
27000 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
27010 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
27020 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
27030 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
27040 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
27050 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
27060 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
27070 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
27080 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
27090 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
270a0 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
270b0 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
270c0 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
270d0 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
270e0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
270f0 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
27100 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
27110 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
27120 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
27130 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
27140 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
27150 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
27160 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
27170 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
27180 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
27190 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
271a0 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
271b0 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
271c0 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
271d0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
271e0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
271f0 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
27200 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
27210 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
27220 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
27230 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
27240 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
27250 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
27260 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
27270 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  , sqlite3 *db){.
27280 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38    u8 *pTmp = (u8
27290 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   *)pPager->pTmpS
272a0 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  pace;..  assert(
272b0 20 64 62 20 7c 7c 20 70 61 67 65 72 55 73 65 57   db || pagerUseW
272c0 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
272d0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
272e0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
272f0 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62  ager) );.  disab
27300 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
27310 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
27320 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
27330 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72 46  lloc();.  pagerF
27340 72 65 65 4d 61 70 48 64 72 73 28 70 50 61 67 65  reeMapHdrs(pPage
27350 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  r);.  /* pPager-
27360 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f  >errCode = 0; */
27370 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
27380 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69  siveMode = 0;.#i
27390 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
273a0 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20  T_WAL.  assert( 
273b0 64 62 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 57  db || pPager->pW
273c0 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al==0 );.  sqlit
273d0 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65  e3WalClose(pPage
273e0 72 2d 3e 70 57 61 6c 2c 20 64 62 2c 20 70 50 61  r->pWal, db, pPa
273f0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
27400 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  gs, pPager->page
27410 53 69 7a 65 2c 0a 20 20 20 20 20 20 28 64 62 20  Size,.      (db 
27420 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
27430 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43  SQLITE_NoCkptOnC
27440 6c 6f 73 65 29 20 3f 20 30 20 3a 20 70 54 6d 70  lose) ? 0 : pTmp
27450 29 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ).  );.  pPager-
27460 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  >pWal = 0;.#endi
27470 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28  f.  pager_reset(
27480 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d  pPager);.  if( M
27490 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65  EMDB ){.    page
274a0 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
274b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
274c0 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c  * If it is open,
274d0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
274e0 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  l file before ca
274f0 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52  lling UnlockAndR
27500 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20  ollback..    ** 
27510 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64  If this is not d
27520 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73  one, then an uns
27530 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
27540 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   the open journa
27550 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d  l .    ** file m
27560 61 79 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  ay be played bac
27570 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
27580 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20  ase. If a power 
27590 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a  failure occurs .
275a0 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69      ** while thi
275b0 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
275c0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
275d0 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
275e0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
275f0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
27600 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
27610 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75   to sync the jou
27620 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20  rnal, shift the 
27630 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74  pager.    ** int
27640 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
27650 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 55  e. This causes U
27660 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
27670 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20   to unlock the. 
27680 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
27690 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  nd close the jou
276a0 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75  rnal file withou
276b0 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  t attempting to 
276c0 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62  roll it.    ** b
276d0 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20  ack or finalize 
276e0 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74  it. The next dat
276f0 61 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20  abase user will 
27700 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a  have to do hot-j
27710 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f  ournal.    ** ro
27720 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63  llback before ac
27730 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61  cessing the data
27740 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
27750 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  /.    if( isOpen
27760 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
27770 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
27780 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67 65 72  or(pPager, pager
27790 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
277a0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20  Pager));.    }. 
277b0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
277c0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
277d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
277e0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
277f0 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
27800 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
27810 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
27820 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
27830 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
27840 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
27850 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
27860 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  r)).  sqlite3OsC
27870 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
27880 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  );.  sqlite3OsCl
27890 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
278a0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
278b0 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69  ee(pTmp);.  sqli
278c0 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70  te3PcacheClose(p
278d0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
278e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
278f0 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
27900 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
27910 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f  ee ) pPager->xCo
27920 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e  decFree(pPager->
27930 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a  pCodec);.#endif.
27940 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
27950 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26  er->aSavepoint &
27960 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  & !pPager->pInJo
27970 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
27980 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
27990 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70  r->jfd) && !isOp
279a0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
279b0 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   );..  sqlite3_f
279c0 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
279d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
279e0 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
279f0 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
27a00 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
27a10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
27a20 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
27a30 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50  r page pPg..*/.P
27a40 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  gno sqlite3Pager
27a50 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67  Pagenumber(DbPag
27a60 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
27a70 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23  n pPg->pgno;.}.#
27a80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
27a90 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
27aa0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70  ence count for p
27ab0 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64  age pPg..*/.void
27ac0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
27ad0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
27ae0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
27af0 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  f(pPg);.}../*.**
27b00 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
27b10 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
27b20 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
27b30 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
27b40 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
27b50 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
27b60 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
27b70 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
27b80 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
27b90 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20  disk and can be 
27ba0 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  restored in the 
27bb0 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a  event of a hot-j
27bc0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
27bd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61  .**.** If the Pa
27be0 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20  ger.noSync flag 
27bf0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69  is set, then thi
27c00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
27c10 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77  no-op..** Otherw
27c20 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73  ise, the actions
27c30 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64   required depend
27c40 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   on the journal-
27c50 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a  mode and the .**
27c60 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
27c70 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 66  ristics of the f
27c80 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66  ile-system, as f
27c90 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
27ca0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
27cb0 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d   file is an in-m
27cc0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
27cd0 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65  le, no action ne
27ce0 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b  ed.**     be tak
27cf0 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74  en..**.**   * Ot
27d00 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
27d10 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
27d20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45  support the SAFE
27d30 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
27d40 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68  ,.**     then th
27d50 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20  e nRec field of 
27d60 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
27d70 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61  y written journa
27d80 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  l header.**     
27d90 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f  is updated to co
27da0 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
27db0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f   of journal reco
27dc0 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  rds that have.**
27dd0 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65       been writte
27de0 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20  n following it. 
27df0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
27e00 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c  operating in ful
27e10 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f  l-sync.**     mo
27e20 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
27e30 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
27e40 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ced before this 
27e50 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
27e60 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  ..**.**   * If t
27e70 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
27e80 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
27e90 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72  EQUENTIAL proper
27ea0 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20  ty, then .**    
27eb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27ec0 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   synced..**.** O
27ed0 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64  r, in pseudo-cod
27ee0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e  e:.**.**   if( N
27ef0 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  OT <in-memory jo
27f00 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20  urnal> ){.**    
27f10 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50   if( NOT SAFE_AP
27f20 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20  PEND ){.**      
27f30 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20   if( <full-sync 
27f40 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a  mode> ) xSync(<j
27f50 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
27f60 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20  *       <update 
27f70 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20  nRec field>.**  
27f80 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28     } .**     if(
27f90 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20   NOT SEQUENTIAL 
27fa0 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
27fb0 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a   file>);.**   }.
27fc0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
27fd0 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ful, this routin
27fe0 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48  e clears the PGH
27ff0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
28000 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70  g of every .** p
28010 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65  age currently he
28020 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66  ld in memory bef
28030 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51  ore returning SQ
28040 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
28050 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e  O.** error is en
28060 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
28070 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
28080 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
28090 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
280a0 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
280b0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
280c0 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72  ager, int newHdr
280d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
280e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
28100 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
28110 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
28120 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
28130 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
28140 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
28150 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
28160 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
28170 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
28180 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
28190 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
281a0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
281b0 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
281c0 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
281d0 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  eLock(pPager);. 
281e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
281f0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
28200 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
28210 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
28220 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
28230 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
28240 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
28250 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
28260 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
28270 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
28280 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
28290 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d   const int iDc =
282a0 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
282b0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
282c0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
282d0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
282e0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
282f0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
28300 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
28310 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
28320 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
28330 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  s block deals wi
28340 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72  th an obscure pr
28350 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61  oblem. If the la
28360 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  st connection.  
28370 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72        ** that wr
28380 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61  ote to this data
28390 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69  base was operati
283a0 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74  ng in persistent
283b0 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  -journal.       
283c0 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74   ** mode, then t
283d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
283e0 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  may at this poin
283f0 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61  t actually be la
28400 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rger.        ** 
28410 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  than Pager.journ
28420 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20  alOff bytes. If 
28430 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69  the next thing i
28440 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
28450 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61        ** file ha
28460 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f  ppens to be a jo
28470 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72  urnal-header (wr
28480 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66  itten as part of
28490 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
284a0 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74  previous connect
284b0 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f  ion's transactio
284c0 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20  n), and a crash 
284d0 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  or power-failure
284e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63   .        ** occ
284f0 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69  urs after nRec i
28500 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65  s updated but be
28510 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  fore this connec
28520 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20  tion writes .   
28530 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67       ** anything
28540 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75   else to the jou
28550 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f  rnal file (or co
28560 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b  mmits/rolls back
28570 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   its .        **
28580 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
28590 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62  hen SQLite may b
285a0 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77  ecome confused w
285b0 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20  hen doing the . 
285c0 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f         ** hot-jo
285d0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66  urnal rollback f
285e0 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
285f0 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62  y. It may roll b
28600 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20  ack all.        
28610 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  ** of this conne
28620 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65  ctions data, the
28630 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c  n proceed to rol
28640 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c  ling back the ol
28650 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  d,.        ** ou
28660 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74  t-of-date data t
28670 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20  hat follows it. 
28680 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
28690 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
286a0 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f          ** To wo
286b0 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
286c0 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
286d0 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20  ile does appear 
286e0 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  to contain.     
286f0 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65     ** a valid he
28700 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50  ader following P
28710 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ager.journalOff,
28720 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78   then write a 0x
28730 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  00.        ** by
28740 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  te to the start 
28750 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74  of it to prevent
28760 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72   it from being r
28770 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20  ecognized..     
28780 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
28790 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48   Variable iNextH
287a0 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
287b0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  to the offset at
287c0 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20   which this.    
287d0 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74      ** problemat
287e0 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f  ic header will o
287f0 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73  ccur, if it exis
28800 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73  ts. aMagic is us
28810 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ed .        ** a
28820 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  s a temporary bu
28830 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20  ffer to inspect 
28840 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
28850 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20   of bytes of.   
28860 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65       ** the pote
28870 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65  ntial journal he
28880 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ader..        */
28890 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
288a0 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  xtHdrOffset;.   
288b0 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38       u8 aMagic[8
288c0 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48  ];.        u8 zH
288d0 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
288e0 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a  urnalMagic)+4];.
288f0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
28900 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
28910 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
28920 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
28930 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
28940 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
28950 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
28960 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  ], pPager->nRec)
28970 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ;..        iNext
28980 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72  HdrOffset = jour
28990 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
289a0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ger);.        rc
289b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
289c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
289d0 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64  agic, 8, iNextHd
289e0 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
289f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28a00 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  _OK && 0==memcmp
28a10 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
28a20 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20  lMagic, 8) ){.  
28a30 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
28a40 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65  onst u8 zerobyte
28a50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
28a60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
28a70 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
28a80 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69   &zerobyte, 1, i
28a90 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
28aa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28ab0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28ac0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
28ad0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
28ae0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
28af0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28b00 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
28b10 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
28b20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
28b30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
28b40 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
28b50 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
28b60 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
28b70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
28b80 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
28b90 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
28ba0 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
28bb0 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
28bc0 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
28bd0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
28be0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
28bf0 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
28c00 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
28c10 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
28c20 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
28c30 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
28c40 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
28c50 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
28c60 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
28c70 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
28c80 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
28c90 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
28ca0 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
28cb0 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
28cc0 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
28cd0 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
28ce0 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
28cf0 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
28d00 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
28d10 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
28d20 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
28d30 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
28d40 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
28d50 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
28d60 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
28d70 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
28d80 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
28d90 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
28da0 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
28db0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
28dc0 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
28dd0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
28de0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
28df0 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
28e00 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
28e10 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
28e20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28e30 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
28e40 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
28e50 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ncFlags);.      
28e60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28e70 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
28e80 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
28e90 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
28ea0 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20  HDR %p %lld\n", 
28eb0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
28ec0 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20  journalHdr));.  
28ed0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28ee0 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20  e3OsWrite(.     
28ef0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
28f00 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
28f10 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50  eof(zHeader), pP
28f20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
28f30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
28f40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28f50 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
28f60 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
28f70 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
28f80 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
28f90 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
28fa0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
28fb0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
28fc0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
28fd0 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
28fe0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
28ff0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
29000 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29010 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
29020 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
29030 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20  syncFlags| .    
29040 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
29050 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45  yncFlags==SQLITE
29060 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
29070 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
29080 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
29090 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
290a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
290b0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
290c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
290d0 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
290e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
290f0 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26     if( newHdr &&
29100 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
29110 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
29120 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  D) ){.        pP
29130 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
29140 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
29150 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
29160 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
29170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29180 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29190 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
291a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
291b0 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
291c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
291d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
291e0 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
291f0 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64  is in noSync mod
29200 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  e, the journal f
29210 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20  ile was just .  
29220 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
29230 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77  synced. Either w
29240 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ay, clear the PG
29250 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
29260 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20  ag on .  ** all 
29270 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  pages..  */.  sq
29280 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
29290 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72  SyncFlags(pPager
292a0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50  ->pPCache);.  pP
292b0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
292c0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
292d0 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  D;.  assert( ass
292e0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
292f0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
29300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
29310 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
29320 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
29330 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  t in a linked li
29340 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
29350 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62  s connected.** b
29360 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
29370 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ty pointer. This
29380 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73   function writes
29390 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65   each one of the
293a0 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  .** in-memory pa
293b0 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
293c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
293d0 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65  file. The argume
293e0 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c  nt may.** be NUL
293f0 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  L, representing 
29400 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49  an empty list. I
29410 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
29420 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
29430 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
29440 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f  he pager must ho
29450 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  ld at least a RE
29460 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e  SERVED lock when
29470 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
29480 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66  * is called. Bef
29490 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74  ore writing anyt
294a0 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
294b0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
294c0 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61  lock.** is upgra
294d0 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ded to an EXCLUS
294e0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  IVE lock. If the
294f0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
29500 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c  obtained,.** SQL
29510 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
29520 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61  rned and no data
29530 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
29540 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29550 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
29560 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d  pager is a temp-
29570 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74  file pager and t
29580 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73  he actual file-s
29590 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73  ystem file.** is
295a0 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69   not yet open, i
295b0 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
295c0 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61   opened before a
295d0 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77  ny data is .** w
295e0 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a  ritten out..**.*
295f0 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20  * Once the lock 
29600 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65  has been upgrade
29610 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  d and, if necess
29620 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70  ary, the file op
29630 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67  ened,.** the pag
29640 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  es are written o
29650 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
29660 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20  se file in list 
29670 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a  order. Writing.*
29680 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70  * a page is skip
29690 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20  ped if it meets 
296a0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
296b0 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
296c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
296d0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67  page number is g
296e0 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65  reater than Page
296f0 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20  r.dbSize, or.** 
29700 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f    * The PGHDR_DO
29710 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73  NT_WRITE flag is
29720 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65   set on the page
29730 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69  ..**.** If writi
29740 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61  ng out a page ca
29750 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  uses the databas
29760 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
29770 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
29780 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61  .** is updated a
29790 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70  ccordingly. If p
297a0 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e  age 1 is written
297b0 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76   out, then the v
297c0 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69  alue cached.** i
297d0 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  n Pager.dbFileVe
297e0 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20  rs[] is updated 
297f0 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  to match the new
29800 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
29810 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
29820 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
29830 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
29840 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
29850 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
29860 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
29870 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  .** occurs, an I
29880 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
29890 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
298a0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
298b0 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65  ock cannot.** be
298c0 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54   obtained, SQLIT
298d0 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
298e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
298f0 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
29900 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50  gelist(Pager *pP
29910 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69  ager, PgHdr *pLi
29920 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
29930 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
29940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
29950 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
29960 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
29970 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
29980 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61   for rollback pa
29990 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44  gers in WRITER_D
299a0 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  BMOD state. */. 
299b0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
299c0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
299d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
299e0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 70  r->tempFile || p
299f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
29a00 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
29a10 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
29a20 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
29a30 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
29a40 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
29a50 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
29a60 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30  pList->pDirty==0
29a70 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
29a80 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d   file is a temp-
29a90 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
29aa0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
29ab0 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20  en it now. It.  
29ac0 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
29ad0 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20  le for rc to be 
29ae0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
29af0 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61  E_OK if this bra
29b00 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65  nch.  ** is take
29b10 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74  n, as pager_wait
29b20 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20  _on_lock() is a 
29b30 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66  no-op for temp-f
29b40 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  iles..  */.  if(
29b50 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
29b60 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
29b70 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
29b80 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  File && rc==SQLI
29b90 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
29ba0 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
29bb0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
29bc0 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
29bd0 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
29be0 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   Before the firs
29bf0 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68  t write, give th
29c00 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20  e VFS a hint of 
29c10 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  what the final. 
29c20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69   ** file size wi
29c30 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  ll be..  */.  as
29c40 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
29c50 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
29c60 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69  ager->fd) );.  i
29c70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29c80 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e   .   && pPager->
29c90 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65  dbHintSize<pPage
29ca0 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20  r->dbSize.   && 
29cb0 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c  (pList->pDirty |
29cc0 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50  | pList->pgno>pP
29cd0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
29ce0 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ).  ){.    sqlit
29cf0 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20  e3_int64 szFile 
29d00 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
29d10 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e  ze * (sqlite3_in
29d20 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69  t64)pPager->dbSi
29d30 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  ze;.    sqlite3O
29d40 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
29d50 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
29d60 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
29d70 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20  INT, &szFile);. 
29d80 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e     pPager->dbHin
29d90 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
29da0 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77  dbSize;.  }..  w
29db0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
29dc0 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
29dd0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
29de0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
29df0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
29e00 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
29e10 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
29e20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
29e30 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
29e40 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
29e50 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
29e60 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
29e70 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
29e80 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
29e90 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
29ea0 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
29eb0 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
29ec0 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
29ed0 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
29ee0 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
29ef0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
29f00 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
29f10 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
29f20 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
29f30 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
29f40 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
29f50 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
29f60 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
29f70 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
29f80 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
29f90 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
29fa0 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
29fb0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
29fc0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
29fd0 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
29fe0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
29ff0 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
2a000 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
2a010 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
2a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a040 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
2a050 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
2a060 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74    assert( (pList
2a070 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2a080 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
2a090 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
2a0a0 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f  pgno==1 ) pager_
2a0b0 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
2a0c0 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20  ter(pList);..   
2a0d0 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
2a0e0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
2a0f0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
2a100 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
2a110 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
2a120 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2a130 54 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  T, pData);..    
2a140 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74    /* Write out t
2a150 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f  he page data. */
2a160 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2a170 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
2a180 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50  r->fd, pData, pP
2a190 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2a1a0 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20  offset);..      
2a1b0 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73  /* If page 1 was
2a1c0 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75   just written, u
2a1d0 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69  pdate Pager.dbFi
2a1e0 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a  leVers to match.
2a1f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
2a200 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e  ue now stored in
2a210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a220 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74  le. If writing t
2a230 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61  his .      ** pa
2a240 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61  ge caused the da
2a250 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
2a260 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69  row, update dbFi
2a270 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a  leSize. .      *
2a280 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  /.      if( pgno
2a290 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==1 ){.        m
2a2a0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
2a2b0 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74  bFileVers, &pDat
2a2c0 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50  a[24], sizeof(pP
2a2d0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2a2e0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2a2f0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
2a300 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
2a310 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
2a320 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
2a330 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
2a340 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
2a350 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45  PAGER_STAT_WRITE
2a360 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  ]++;..      /* U
2a370 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70  pdate any backup
2a380 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67   objects copying
2a390 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2a3a0 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a   this pager. */.
2a3b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
2a3c0 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
2a3d0 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
2a3e0 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61   (u8*)pList->pDa
2a3f0 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45  ta);..      PAGE
2a400 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25  RTRACE(("STORE %
2a410 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
2a420 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
2a430 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
2a440 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
2a450 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
2a460 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20  h(pList)));.    
2a470 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
2a480 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
2a490 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
2a4a0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
2a4b0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
2a4c0 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d  db_count);.    }
2a4d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
2a4e0 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45  RTRACE(("NOSTORE
2a4f0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2a500 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2a510 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20   pgno));.    }. 
2a520 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
2a530 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20  ehash(pList);.  
2a540 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
2a550 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20  >pDirty;.  }..  
2a560 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a570 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20  .** Ensure that 
2a580 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2a590 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66  file is open. If
2a5a0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f   it is already o
2a5b0 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75  pen, this .** fu
2a5c0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2a5d0 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  p..**.** SQLITE_
2a5e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
2a5f0 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
2a600 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70  s according to p
2a610 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49  lan. An .** SQLI
2a620 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
2a630 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2a640 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f  ned if a call to
2a650 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29   sqlite3OsOpen()
2a660 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73   .** fails..*/.s
2a670 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75  tatic int openSu
2a680 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  bJournal(Pager *
2a690 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2a6a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2a6b0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
2a6c0 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
2a6d0 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
2a6e0 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s =  SQLITE_OPEN
2a6f0 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 53 51  _SUBJOURNAL | SQ
2a700 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2a710 49 54 45 20 0a 20 20 20 20 20 20 7c 20 53 51 4c  ITE .      | SQL
2a720 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
2a730 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  | SQLITE_OPEN_EX
2a740 43 4c 55 53 49 56 45 20 0a 20 20 20 20 20 20 7c  CLUSIVE .      |
2a750 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
2a760 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20  ETEONCLOSE;.    
2a770 69 6e 74 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d  int nStmtSpill =
2a780 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e   sqlite3Config.n
2a790 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 69  StmtSpill;.    i
2a7a0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
2a7b0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2a7c0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
2a7d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   || pPager->subj
2a7e0 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
2a7f0 20 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 2d    nStmtSpill = -
2a800 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  1;.    }.    rc 
2a810 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
2a820 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66  Open(pPager->pVf
2a830 73 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 6a  s, 0, pPager->sj
2a840 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 74 6d 74  fd, flags, nStmt
2a850 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65  Spill);.  }.  re
2a860 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a870 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72  * Append a recor
2a880 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
2a890 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70   state of page p
2a8a0 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  Pg to the sub-jo
2a8b0 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  urnal. .**.** If
2a8c0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
2a8d0 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70   the bit corresp
2a8e0 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70  onding to pPg->p
2a8f0 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65  gno in the bitve
2a900 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70  cs.** for all op
2a910 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65  en savepoints be
2a920 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
2a930 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2a940 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
2a950 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
2a960 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
2a970 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  l, an IO.** erro
2a980 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74  r code if the at
2a990 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74  tempt to write t
2a9a0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
2a9b0 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
2a9c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
2a9d0 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77  a malloc fails w
2a9e0 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62  hile setting a b
2a9f0 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e  it in a savepoin
2aa00 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a  t.** bitvec..*/.
2aa10 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f  static int subjo
2aa20 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20  urnalPage(PgHdr 
2aa30 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pPg){.  int rc 
2aa40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
2aa50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2aa60 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
2aa70 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2aa80 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
2aa90 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
2aaa0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
2aab0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66   sub-journal, if
2aac0 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   it has not alre
2aad0 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ady been opened 
2aae0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2aaf0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2ab00 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
2ab10 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2ab20 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65  jfd) || pagerUse
2ab30 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
2ab40 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
2ab50 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2ab60 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  || pPager->nSubR
2ab70 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ec==0 );.    ass
2ab80 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
2ab90 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20  (pPager) .      
2aba0 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72     || pageInJour
2abb0 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67 29  nal(pPager, pPg)
2abc0 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50   .         || pP
2abd0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
2abe0 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20  dbOrigSize .    
2abf0 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  );.    rc = open
2ac00 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  SubJournal(pPage
2ac10 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  r);..    /* If t
2ac20 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77  he sub-journal w
2ac30 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73  as opened succes
2ac40 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61  sfully (or was a
2ac50 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20  lready open),.  
2ac60 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a    ** write the j
2ac70 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e  ournal record in
2ac80 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f  to the file.  */
2ac90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2aca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2acb0 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
2acc0 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20  g->pData;.      
2acd0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36  i64 offset = (i6
2ace0 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  4)pPager->nSubRe
2acf0 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
2ad00 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68  eSize);.      ch
2ad10 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20  ar *pData2;.  . 
2ad20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
2ad30 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
2ad40 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
2ad50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2ad60 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  T, pData2);.    
2ad70 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2ad80 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
2ad90 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2ada0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2adb0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
2adc0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
2add0 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66  pPager->sjfd, of
2ade0 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
2adf0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2ae00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ae10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ae20 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2ae30 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
2ae40 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2ae50 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
2ae60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2ae70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ae80 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
2ae90 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
2aea0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2aeb0 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
2aec0 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
2aed0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
2aee0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2aef0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2af00 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
2af10 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49   subjournalPageI
2af20 66 52 65 71 75 69 72 65 64 28 50 67 48 64 72 20  fRequired(PgHdr 
2af30 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 73 75 62  *pPg){.  if( sub
2af40 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
2af50 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
2af60 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2af70 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pPg);.  }else{. 
2af80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2af90 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
2afa0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2afb0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
2afc0 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
2afd0 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
2afe0 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
2aff0 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
2b000 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
2b010 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2b020 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a  a Pager object.*
2b030 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69  * (cast as a voi
2b040 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69  d*). The pager i
2b050 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61  s always 'purgea
2b060 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d  ble' (not an in-
2b070 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
2b080 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  se). The second 
2b090 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65  argument is a re
2b0a0 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67  ference to a pag
2b0b0 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75  e that is .** cu
2b0c0 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75  rrently dirty bu
2b0d0 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  t has no outstan
2b0e0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
2b0f0 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   The page.** is 
2b100 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65  always associate
2b110 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  d with the Pager
2b120 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
2b130 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
2b140 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
2b150 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
2b160 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d  function is to m
2b170 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79  ake pPg clean by
2b180 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e   writing its con
2b190 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20  tents.** out to 
2b1a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b1b0 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20  e, if possible. 
2b1c0 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65  This may involve
2b1d0 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20   syncing the.** 
2b1e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a  journal file. .*
2b1f0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2b200 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68  ul, sqlite3Pcach
2b210 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
2b220 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61  called on the pa
2b230 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ge and.** SQLITE
2b240 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2b250 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2b260 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2b270 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
2b280 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20  page clean, the 
2b290 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2b2a0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
2b2b0 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  e page cannot be
2b2c0 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66  .** made clean f
2b2d0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65  or some other re
2b2e0 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72  ason, but no err
2b2f0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
2b300 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
2b310 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
2b320 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2b330 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  an() is not call
2b340 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2b350 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
2b360 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50  id *p, PgHdr *pP
2b370 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
2b380 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
2b390 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2b3a0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
2b3b0 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
2b3c0 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
2b3d0 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
2b3e0 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20  GHDR_DIRTY );.. 
2b3f0 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   /* The doNotSpi
2b400 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73  ll NOSYNC bit is
2b410 20 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65   set during time
2b420 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73  s when doing a s
2b430 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72  ync of.  ** jour
2b440 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20  nal (and adding 
2b450 61 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73  a new header) is
2b460 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54   not allowed.  T
2b470 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  his occurs.  ** 
2b480 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20  during calls to 
2b490 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2b4a0 65 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67  e() while trying
2b4b0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74   to journal mult
2b4c0 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  iple.  ** pages 
2b4d0 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
2b4e0 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20   same sector..  
2b4f0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f  **.  ** The doNo
2b500 74 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  tSpill ROLLBACK 
2b510 61 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68  and OFF bits inh
2b520 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20  ibits all cache 
2b530 73 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65  spilling.  ** re
2b540 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2b550 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e  her or not a syn
2b560 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  c is required.  
2b570 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69  This is set duri
2b580 6e 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61  ng.  ** a rollba
2b590 63 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72 65  ck or by user re
2b5a0 71 75 65 73 74 2c 20 72 65 73 70 65 63 74 69 76  quest, respectiv
2b5b0 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ely..  **.  ** S
2b5c0 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20  pilling is also 
2b5d0 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20  prohibited when 
2b5e0 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
2b5f0 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75  e since that cou
2b600 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20  ld.  ** lead to 
2b610 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
2b620 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75  ion.   In the cu
2b630 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
2b640 74 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73  tion it .  ** is
2b650 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
2b660 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
2b670 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65  ch() to be calle
2b680 64 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  d with createFla
2b690 67 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20  g==3.  ** while 
2b6a0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
2b6b0 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20  te, hence it is 
2b6c0 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  impossible for t
2b6d0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20  his routine to. 
2b6e0 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e   ** be called in
2b6f0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2b700 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
2b710 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45   we include a NE
2b720 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20  VER().  ** test 
2b730 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  for the error st
2b740 61 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61  ate as a safegua
2b750 72 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72  rd against futur
2b760 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a  e changes..  */.
2b770 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
2b780 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
2b790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b7a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2b7b0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2b7c0 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  & SPILLFLAG_ROLL
2b7d0 42 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61  BACK );.  testca
2b7e0 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  se( pPager->doNo
2b7f0 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
2b800 41 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74  AG_OFF );.  test
2b810 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f  case( pPager->do
2b820 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
2b830 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20  FLAG_NOSYNC );. 
2b840 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e   if( pPager->doN
2b850 6f 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28  otSpill.   && ((
2b860 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2b870 6c 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f  ll & (SPILLFLAG_
2b880 52 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c  ROLLBACK|SPILLFL
2b890 41 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20  AG_OFF))!=0.    
2b8a0 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73    || (pPg->flags
2b8b0 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
2b8c0 4e 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20  NC)!=0).  ){.   
2b8d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b8e0 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70  K;.  }..  pPg->p
2b8f0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28  Dirty = 0;.  if(
2b900 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2b910 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ger) ){.    /* W
2b920 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72  rite a single fr
2b930 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ame for this pag
2b940 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f  e to the log. */
2b950 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75  .    rc = subjou
2b960 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72  rnalPageIfRequir
2b970 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66  ed(pPg); .    if
2b980 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b990 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
2b9a0 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61  gerWalFrames(pPa
2b9b0 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b  ger, pPg, 0, 0);
2b9c0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2b9d0 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74    .    /* Sync t
2b9e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2b9f0 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
2ba00 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
2ba10 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2ba20 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  NC .     || pPag
2ba30 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2ba40 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
2ba50 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  D.    ){.      r
2ba60 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
2ba70 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2ba80 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74  }.  .    /* Writ
2ba90 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
2baa0 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
2bab0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2bac0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
2bad0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2bae0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2baf0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2bb00 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29  _NEED_SYNC)==0 )
2bb10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2bb20 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
2bb30 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  t(pPager, pPg);.
2bb40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2bb50 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
2bb60 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28   clean. */.  if(
2bb70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bb80 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
2bb90 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
2bba0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2bbb0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2bbc0 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
2bbd0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2bbe0 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  n(pPg);.  }..  r
2bbf0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
2bc00 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a  r(pPager, rc); .
2bc10 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
2bc20 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20  ll unreferenced 
2bc30 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 64  dirty pages to d
2bc40 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  isk..*/.int sqli
2bc50 74 65 33 50 61 67 65 72 46 6c 75 73 68 28 50 61  te3PagerFlush(Pa
2bc60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2bc70 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d  int rc = pPager-
2bc80 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20  >errCode;.  if( 
2bc90 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67  !MEMDB ){.    Pg
2bca0 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c  Hdr *pList = sql
2bcb0 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
2bcc0 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
2bcd0 63 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  che);.    assert
2bce0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
2bcf0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
2bd00 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
2bd10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
2bd20 74 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  t ){.      PgHdr
2bd30 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d   *pNext = pList-
2bd40 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 69  >pDirty;.      i
2bd50 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d  f( pList->nRef==
2bd60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
2bd70 3d 20 70 61 67 65 72 53 74 72 65 73 73 28 28 76  = pagerStress((v
2bd80 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  oid*)pPager, pLi
2bd90 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
2bda0 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74     pList = pNext
2bdb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
2bdc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2bdd0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
2bde0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
2bdf0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e   Pager object an
2be00 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
2be10 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50  to it.** in *ppP
2be20 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20  ager. The pager 
2be30 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c  should eventuall
2be40 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61  y be freed by pa
2be50 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73  ssing it.** to s
2be60 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
2be70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  ()..**.** The zF
2be80 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
2be90 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20   is the path to 
2bea0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2beb0 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66  e to open..** If
2bec0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
2bed0 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
2bee0 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
2bef0 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
2bf00 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
2bf10 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
2bf20 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61   cached. Tempora
2bf30 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20  ry files are be 
2bf40 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
2bf50 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68  atically when th
2bf60 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49  ey are closed. I
2bf70 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
2bf80 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a  :memory:" then .
2bf90 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  ** all informati
2bfa0 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
2bfb0 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72  che. It is never
2bfc0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
2bfd0 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62  . .** This can b
2bfe0 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
2bff0 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ent an in-memory
2c000 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
2c010 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61   The nExtra para
2c020 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20  meter specifies 
2c030 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
2c040 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
2c050 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20  ocated.** along 
2c060 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72  with each page r
2c070 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73  eference. This s
2c080 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
2c090 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a  e to the user.**
2c0a0 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33   via the sqlite3
2c0b0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20  PagerGetExtra() 
2c0c0 41 50 49 2e 20 20 57 68 65 6e 20 61 20 6e 65 77  API.  When a new
2c0d0 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74   page is allocat
2c0e0 65 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ed, the.** first
2c0f0 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 69 73   8 bytes of this
2c100 20 73 70 61 63 65 20 61 72 65 20 7a 65 72 6f 65   space are zeroe
2c110 64 20 62 75 74 20 74 68 65 20 72 65 6d 61 69 6e  d but the remain
2c120 64 65 72 20 69 73 20 75 6e 69 6e 69 74 69 61 6c  der is uninitial
2c130 69 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20 65 78  ized..** (The ex
2c140 74 72 61 20 73 70 61 63 65 20 69 73 20 75 73 65  tra space is use
2c150 64 20 62 79 20 62 74 72 65 65 20 61 73 20 74 68  d by btree as th
2c160 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
2c170 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  .).**.** The fla
2c180 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75  gs argument is u
2c190 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70  sed to specify p
2c1a0 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61  roperties that a
2c1b0 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65  ffect the.** ope
2c1c0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  ration of the pa
2c1d0 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  ger. It should b
2c1e0 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69  e passed some bi
2c1f0 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  twise combinatio
2c200 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45  n.** of the PAGE
2c210 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  R_* flags..**.**
2c220 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61   The vfsFlags pa
2c230 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
2c240 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20  mask to pass to 
2c250 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
2c260 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  ter.** of the xO
2c270 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  pen() method of 
2c280 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53  the supplied VFS
2c290 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69   when opening fi
2c2a0 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  les. .**.** If t
2c2b0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
2c2c0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
2c2d0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
2c2e0 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73  ile opened .** s
2c2f0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c  uccessfully, SQL
2c300 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2c310 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20  ed and *ppPager 
2c320 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
2c330 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72  ** the new pager
2c340 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65   object. If an e
2c350 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
2c360 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20  Pager is set to 
2c370 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f  NULL.** and erro
2c380 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
2c390 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
2c3a0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
2c3b0 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74  _NOMEM.** (sqlit
2c3c0 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73  e3Malloc() is us
2c3d0 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
2c3e0 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43  emory), SQLITE_C
2c3f0 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76  ANTOPEN or .** v
2c400 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f  arious SQLITE_IO
2c410 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  _XXX errors..*/.
2c420 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2c430 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
2c440 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
2c450 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
2c460 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
2c470 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
2c480 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
2c490 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
2c4a0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
2c4b0 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
2c4c0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2c4d0 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
2c4e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2c4f0 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
2c500 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
2c510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
2c520 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
2c530 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
2c540 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
2c550 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2c560 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
2c570 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
2c580 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ile */.  int vfs
2c590 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
2c5a0 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65    /* flags passe
2c5b0 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
2c5c0 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
2c5d0 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
2c5e0 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f  init)(DbPage*) /
2c5f0 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65  * Function to re
2c600 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73  initialize pages
2c610 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74   */.){.  u8 *pPt
2c620 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r;.  Pager *pPag
2c630 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
2c640 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   Pager object to
2c650 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
2c660 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
2c670 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2c680 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2c690 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46  e */.  int tempF
2c6a0 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
2c6b0 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70  /* True for temp
2c6c0 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e   files (incl. in
2c6d0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a  -memory files) *
2c6e0 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  /.  int memDb = 
2c6f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2c700 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2c710 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
2c720 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f  e */.  int readO
2c730 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
2c740 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2c750 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66  is a read-only f
2c760 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  ile */.  int jou
2c770 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20  rnalFileSize;   
2c780 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2c790 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20  locate for each 
2c7a0 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20  journal fd */.  
2c7b0 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20  char *zPathname 
2c7c0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c  = 0;     /* Full
2c7d0 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   path to databas
2c7e0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
2c7f0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  nPathname = 0;  
2c800 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c810 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68  f bytes in zPath
2c820 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  name */.  int us
2c830 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
2c840 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
2c850 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46  OURNAL)==0; /* F
2c860 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75  alse to omit jou
2c870 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63  rnal */.  int pc
2c880 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  acheSize = sqlit
2c890 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20  e3PcacheSize(); 
2c8a0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74        /* Bytes t
2c8b0 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50  o allocate for P
2c8c0 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73  Cache */.  u32 s
2c8d0 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2c8e0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2c8f0 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c  SIZE;  /* Defaul
2c900 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  t page size */. 
2c910 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
2c920 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49  i = 0;    /* URI
2c930 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f   args to copy */
2c940 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b  .  int nUri = 0;
2c950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2c960 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2c970 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a  f URI args at *z
2c980 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  Uri */..  /* Fig
2c990 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
2c9a0 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
2c9b0 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  ed for each jour
2c9c0 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a  nal file-handle.
2c9d0 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20    ** (there are 
2c9e0 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65  two of them, the
2c9f0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
2ca00 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  d the sub-journa
2ca10 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61  l).  */.  journa
2ca20 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
2ca30 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  D8(sqlite3Journa
2ca40 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 0a 20  lSize(pVfs));.. 
2ca50 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70   /* Set the outp
2ca60 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e  ut variable to N
2ca70 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65  ULL in case an e
2ca80 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
2ca90 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
2caa0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2cab0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
2cac0 69 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45  if( flags & PAGE
2cad0 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  R_MEMORY ){.    
2cae0 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69  memDb = 1;.    i
2caf0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
2cb00 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
2cb10 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20        zPathname 
2cb20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
2cb30 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  p(0, zFilename);
2cb40 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 74 68  .      if( zPath
2cb50 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72  name==0  ) retur
2cb60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2cb70 4b 50 54 3b 0a 20 20 20 20 20 20 6e 50 61 74 68  KPT;.      nPath
2cb80 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
2cb90 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
2cba0 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  );.      zFilena
2cbb0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  me = 0;.    }.  
2cbc0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  }.#endif..  /* C
2cbd0 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
2cbe0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
2cbf0 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
2cc00 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
2cc10 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
2cc20 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
2cc30 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
2cc40 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
2cc50 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
2cc60 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
2cc70 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
2cc80 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
2cc90 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2cca0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2ccb0 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ] ){.    const c
2ccc0 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74  har *z;.    nPat
2ccd0 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
2cce0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
2ccf0 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2cd00 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
2cd10 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a  , nPathname*2);.
2cd20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2cd30 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
2cd40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2cd50 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
2cd60 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
2cd70 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
2cd80 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
2cd90 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
2cda0 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
2cdb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
2cdc0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
2cdd0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
2cde0 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
2cdf0 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  e);.    nPathnam
2ce00 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2ce10 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
2ce20 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26      z = zUri = &
2ce30 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65  zFilename[sqlite
2ce40 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
2ce50 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ame)+1];.    whi
2ce60 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
2ce70 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2ce80 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20  en30(z)+1;.     
2ce90 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2cea0 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2ceb0 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e  }.    nUri = (in
2cec0 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29  t)(&z[1] - zUri)
2ced0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55  ;.    assert( nU
2cee0 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ri>=0 );.    if(
2cef0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2cf00 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
2cf10 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
2cf20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2cf30 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
2cf40 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
2cf50 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
2cf60 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
2cf70 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
2cf80 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
2cf90 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
2cfa0 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
2cfb0 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
2cfc0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
2cfd0 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
2cfe0 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
2cff0 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
2d000 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
2d010 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
2d020 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
2d030 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
2d040 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2d050 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
2d060 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2d070 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
2d080 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
2d090 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
2d0a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d0b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2d0c0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2d0d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d0e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
2d0f0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
2d100 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
2d110 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
2d120 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
2d130 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
2d140 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
2d150 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
2d160 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
2d170 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
2d180 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
2d190 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
2d1a0 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
2d1b0 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
2d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1d0 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
2d1e0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2d1f0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
2d200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d210 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
2d220 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
2d230 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
2d240 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2d250 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
2d260 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
2d270 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
2d280 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
2d290 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2d2a0 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2d2b0 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
2d2c0 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2d2d0 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2d2e0 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2d2f0 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
2d300 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2d310 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2d320 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
2d330 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
2d340 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2d350 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2d360 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
2d370 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
2d380 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2d390 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
2d3a0 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
2d3b0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
2d3c0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
2d3d0 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2d3e0 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
2d3f0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
2d400 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
2d410 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
2d420 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
2d430 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
2d440 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2d450 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
2d460 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
2d470 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
2d480 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2d490 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f  nUri +         /
2d4a0 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
2d4b0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
2d4c0 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2d4d0 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
2d4e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d4f0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e  OMIT_WAL.    + n
2d500 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32  Pathname + 4 + 2
2d510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2d520 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  Wal */.#endif.  
2d530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2d540 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2d550 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  T(SQLITE_INT_TO_
2d560 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  PTR(journalFileS
2d570 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21  ize)) );.  if( !
2d580 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  pPtr ){.    sqli
2d590 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2d5a0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
2d5b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d5c0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
2d5d0 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20  ger =           
2d5e0 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72     (Pager*)(pPtr
2d5f0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43  );.  pPager->pPC
2d600 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68  ache =    (PCach
2d610 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2d620 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2d630 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r)));.  pPager->
2d640 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f  fd =   (sqlite3_
2d650 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2d660 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2d670 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a  ));.  pPager->sj
2d680 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
2d690 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2d6a0 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2d6b0 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le));.  pPager->
2d6c0 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f  jfd =  (sqlite3_
2d6d0 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a  file*)(pPtr += j
2d6e0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2d6f0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
2d700 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a  name =    (char*
2d710 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2d720 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73  lFileSize);.  as
2d730 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2d740 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65  _ALIGNMENT(pPage
2d750 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
2d760 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67   Fill in the Pag
2d770 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64  er.zFilename and
2d780 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20   Pager.zJournal 
2d790 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75  buffers, if requ
2d7a0 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  ired. */.  if( z
2d7b0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
2d7c0 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d  assert( nPathnam
2d7d0 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  e>0 );.    pPage
2d7e0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20  r->zJournal =   
2d7f0 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2d800 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2d810 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2d820 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
2d830 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
2d840 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2d850 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70  if( nUri ) memcp
2d860 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  y(&pPager->zFile
2d870 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
2d880 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a  ], zUri, nUri);.
2d890 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2d8a0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61  r->zJournal, zPa
2d8b0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2d8c0 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2d8d0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2d8e0 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
2d8f0 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32  ournal\000", 8+2
2d900 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2d910 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2d920 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2d930 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
2d940 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d950 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67  MIT_WAL.    pPag
2d960 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67  er->zWal = &pPag
2d970 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2d980 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20  thname+8+1];.   
2d990 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2d9a0 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  zWal, zPathname,
2d9b0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2d9c0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2d9d0 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  >zWal[nPathname]
2d9e0 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b  , "-wal\000", 4+
2d9f0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  1);.    sqlite3F
2da00 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2da10 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2da20 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e  ager->zWal);.#en
2da30 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dif.    sqlite3D
2da40 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2da50 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  me);.  }.  pPage
2da60 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
2da70 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
2da80 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a  gs = vfsFlags;..
2da90 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
2daa0 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
2dab0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2dac0 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2dad0 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
2dae0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2daf0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
2db00 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
2db10 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
2db20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2db30 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2db40 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2db50 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
2db60 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73   &fout);.    ass
2db70 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20  ert( !memDb );. 
2db80 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66     readOnly = (f
2db90 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
2dba0 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20  READONLY);..    
2dbb0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
2dbc0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
2dbd0 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f  opened for read/
2dbe0 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20  write access,.  
2dbf0 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
2dc00 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2dc10 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
2dc20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
2dc30 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2dc40 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  le. The default 
2dc50 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65  page size is the
2dc60 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20   maximum of:.   
2dc70 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20   **.    **    + 
2dc80 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2dc90 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a  AGE_SIZE,.    **
2dca0 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20      + The value 
2dcb0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
2dcc0 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
2dcd0 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ).    **    + Th
2dce0 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73  e largest page s
2dcf0 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ize that can be 
2dd00 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
2dd10 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
2dd20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2dd30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
2dd40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
2dd50 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
2dd60 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
2dd70 20 20 20 20 20 20 69 66 28 20 21 72 65 61 64 4f        if( !readO
2dd80 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nly ){.        s
2dd90 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2dda0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ger);.        as
2ddb0 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
2ddc0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
2ddd0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2dde0 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
2ddf0 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
2de00 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63  Dflt<pPager->sec
2de10 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
2de20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
2de30 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49  >sectorSize>SQLI
2de40 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2de50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
2de60 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2de70 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lt = SQLITE_MAX_
2de80 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2de90 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  E;.          }el
2dea0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2deb0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33  szPageDflt = (u3
2dec0 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  2)pPager->sector
2ded0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
2dee0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64  }.        }.#ifd
2def0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2df00 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2df10 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2df20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
2df30 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2df40 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
2df50 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
2df60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2df70 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2df80 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
2df90 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
2dfa0 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f  sert(SQLITE_MAX_
2dfb0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2dfc0 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20  E<=65536);.     
2dfd0 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61       for(ii=szPa
2dfe0 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49  geDflt; ii<=SQLI
2dff0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2e000 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a  AGE_SIZE; ii=ii*
2e010 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2){.            
2e020 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
2e030 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
2e040 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20  >>8)) ){.       
2e050 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2e060 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
2e070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e080 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  }.        }.#end
2e090 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
2e0a0 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
2e0b0 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  = sqlite3_uri_bo
2e0c0 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  olean(zFilename,
2e0d0 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20   "nolock", 0);. 
2e0e0 20 20 20 20 20 69 66 28 20 28 69 44 63 20 26 20       if( (iDc & 
2e0f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d  SQLITE_IOCAP_IMM
2e100 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20  UTABLE)!=0.     
2e110 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69    || sqlite3_uri
2e120 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61  _boolean(zFilena
2e130 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c  me, "immutable",
2e140 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
2e150 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c   vfsFlags |= SQL
2e160 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2e170 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  Y;.          got
2e180 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f  o act_like_temp_
2e190 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  file;.      }.  
2e1a0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2e1b0 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
2e1c0 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
2e1d0 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
2e1e0 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
2e1f0 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
2e200 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
2e210 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
2e220 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
2e230 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
2e240 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
2e250 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
2e260 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
2e270 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
2e280 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2e290 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
2e2a0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2e2b0 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
2e2c0 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
2e2d0 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
2e2e0 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
2e2f0 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
2e300 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
2e310 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
2e320 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
2e330 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
2e340 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2e350 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72  is branch also r
2e360 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61  uns for files ma
2e370 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c  rked as immutabl
2e380 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c  e..    */ .act_l
2e390 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20  ike_temp_file:. 
2e3a0 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
2e3b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
2e3c0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
2e3d0 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65  ER;     /* Prete
2e3e0 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  nd we already ha
2e3f0 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  ve a lock */.   
2e400 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
2e410 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
2e420 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77      /* Pretend w
2e430 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49  e are in EXCLUSI
2e440 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70  VE mode */.    p
2e450 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20  Pager->noLock = 
2e460 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2e470 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69    /* Do no locki
2e480 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e  ng */.    readOn
2e490 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53  ly = (vfsFlags&S
2e4a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2e4b0 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  NLY);.  }..  /* 
2e4c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
2e4d0 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61  ll to PagerSetPa
2e4e0 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20  gesize() serves 
2e4f0 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  to set the value
2e500 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e   of .  ** Pager.
2e510 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20  pageSize and to 
2e520 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67  allocate the Pag
2e530 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
2e540 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  fer..  */.  if( 
2e550 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e560 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e570 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b  ger->memDb==0 );
2e580 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2e590 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
2e5a0 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67  e(pPager, &szPag
2e5b0 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20  eDflt, -1);.    
2e5c0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
2e5d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
2e5e0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2e5f0 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
2e600 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  t. */.  if( rc==
2e610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e620 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
2e630 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 61 73  (nExtra);.    as
2e640 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 38 20  sert( nExtra>=8 
2e650 26 26 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29  && nExtra<1000 )
2e660 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2e670 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50  e3PcacheOpen(szP
2e680 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c  ageDflt, nExtra,
2e690 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20   !memDb,.       
2e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6b0 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65  !memDb?pagerStre
2e6c0 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50  ss:0, (void *)pP
2e6d0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50  ager, pPager->pP
2e6e0 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Cache);.  }..  /
2e6f0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2e700 63 75 72 72 65 64 20 61 62 6f 76 65 2c 20 66 72  curred above, fr
2e710 65 65 20 74 68 65 20 20 50 61 67 65 72 20 73 74  ee the  Pager st
2e720 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
2e730 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  e the file..  */
2e740 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2e750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
2e760 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
2e770 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  r->fd);.    sqli
2e780 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
2e790 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
2e7a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2e7b0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
2e7c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2e7d0 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45  PAGERTRACE(("OPE
2e7e0 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45  N %d %s\n", FILE
2e7f0 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d  HANDLEID(pPager-
2e800 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46  >fd), pPager->zF
2e810 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54  ilename));.  IOT
2e820 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
2e830 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  s\n", pPager, pP
2e840 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2e850 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  )..  pPager->use
2e860 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73  Journal = (u8)us
2e870 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70  eJournal;.  /* p
2e880 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
2e890 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e8a0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
2e8b0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e8c0 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
2e8d0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2e8e0 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
2e8f0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2e900 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
2e910 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
2e920 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2e930 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
2e940 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
2e950 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
2e960 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
2e970 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50  LOCK; */.  /* pP
2e980 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
2e990 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2e9a0 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74  tempFile = (u8)t
2e9b0 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72  empFile;.  asser
2e9c0 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  t( tempFile==PAG
2e9d0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
2e9e0 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20  ORMAL .         
2e9f0 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41   || tempFile==PA
2ea00 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2ea10 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
2ea20 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
2ea30 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2ea40 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65  VE==1 );.  pPage
2ea50 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2ea60 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
2ea70 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e   .  pPager->chan
2ea80 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
2ea90 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
2eaa0 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20    pPager->memDb 
2eab0 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70  = (u8)memDb;.  p
2eac0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
2ead0 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a  = (u8)readOnly;.
2eae0 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75    assert( useJou
2eaf0 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e  rnal || pPager->
2eb00 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50  tempFile );.  pP
2eb10 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70  ager->noSync = p
2eb20 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
2eb30 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
2eb40 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  oSync ){.    ass
2eb50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
2eb60 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  lSync==0 );.    
2eb70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2eb80 65 78 74 72 61 53 79 6e 63 3d 3d 30 20 29 3b 0a  extraSync==0 );.
2eb90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2eba0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30  er->syncFlags==0
2ebb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2ebc0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2ebd0 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61  lags==0 );.    a
2ebe0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
2ebf0 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20  kptSyncFlags==0 
2ec00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2ec10 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2ec20 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2ec30 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b  ->extraSync = 0;
2ec40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
2ec50 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2ec60 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
2ec70 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
2ec80 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2ec90 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c  YNC_NORMAL | WAL
2eca0 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f  _SYNC_TRANSACTIO
2ecb0 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  NS;.    pPager->
2ecc0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
2ecd0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2ece0 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  AL;.  }.  /* pPa
2ecf0 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
2ed00 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2ed10 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
2ed20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2ed30 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
2ed40 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
2ed50 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b  a = (u16)nExtra;
2ed60 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
2ed70 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51  alSizeLimit = SQ
2ed80 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55  LITE_DEFAULT_JOU
2ed90 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b  RNAL_SIZE_LIMIT;
2eda0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
2edb0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
2edc0 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73   tempFile );.  s
2edd0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2ede0 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65  ger);.  if( !use
2edf0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70  Journal ){.    p
2ee00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2ee10 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2ee20 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65  ALMODE_OFF;.  }e
2ee30 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b  lse if( memDb ){
2ee40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2ee50 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2ee60 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2ee70 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  ORY;.  }.  /* pP
2ee80 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
2ee90 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
2eea0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
2eeb0 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a  dlerArg = 0; */.
2eec0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
2eed0 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20  ter = xReinit;. 
2eee0 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
2eef0 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
2ef00 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
2ef10 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  h)); */.  /* pPa
2ef20 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51  ger->szMmap = SQ
2ef30 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41  LITE_DEFAULT_MMA
2ef40 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62  P_SIZE // will b
2ef50 65 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63  e set by btree.c
2ef60 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20   */..  *ppPager 
2ef70 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
2ef80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ef90 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74  ../* Verify that
2efa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2efb0 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65  le has not be de
2efc0 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64  leted or renamed
2efd0 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64   out from.** und
2efe0 65 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 52  er the pager.  R
2eff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2f000 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2f010 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74  is still were it
2f020 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20   ought.** to be 
2f030 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  on disk.  Return
2f040 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54   non-zero (SQLIT
2f050 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
2f060 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ED or some other
2f070 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66   error.** code f
2f080 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  rom sqlite3OsAcc
2f090 65 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61  ess()) if the da
2f0a0 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20  tabase has gone 
2f0b0 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  missing..*/.stat
2f0c0 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49  ic int databaseI
2f0d0 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a  sUnmoved(Pager *
2f0e0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62  pPager){.  int b
2f0f0 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
2f100 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
2f110 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2f120 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2f130 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
2f140 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65  ->dbSize==0 ) re
2f150 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f160 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2f170 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70  ->zFilename && p
2f180 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2f190 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  [0] );.  rc = sq
2f1a0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
2f1b0 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
2f1c0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f  QLITE_FCNTL_HAS_
2f1d0 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65  MOVED, &bHasMove
2f1e0 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
2f1f0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
2f200 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48  .    /* If the H
2f210 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f  AS_MOVED file-co
2f220 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65  ntrol is unimple
2f230 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74  mented, assume t
2f240 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20  hat the file.   
2f250 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
2f260 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73   moved.  That is
2f270 20 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20   the historical 
2f280 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69  behavior of SQLi
2f290 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  te: prior to.   
2f2a0 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e   ** version 3.8.
2f2b0 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63  3, it never chec
2f2c0 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ked */.    rc = 
2f2d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2f2e0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
2f2f0 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65  E_OK && bHasMove
2f300 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  d ){.    rc = SQ
2f310 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
2f320 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74  MOVED;.  }.  ret
2f330 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2f340 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2f350 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
2f360 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
2f370 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
2f380 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
2f390 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
2f3a0 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
2f3b0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
2f3c0 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
2f3d0 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
2f3e0 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
2f3f0 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
2f400 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
2f410 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
2f420 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
2f430 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2f440 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
2f450 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
2f460 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
2f470 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
2f480 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
2f490 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2f4a0 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
2f4b0 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
2f4c0 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
2f4d0 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
2f4e0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2f4f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2f500 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
2f510 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
2f520 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
2f530 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
2f540 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
2f550 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
2f560 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
2f570 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2f580 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
2f590 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
2f5a0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
2f5b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2f5c0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
2f5d0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
2f5e0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
2f5f0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
2f600 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
2f610 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
2f620 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
2f630 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
2f640 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
2f650 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
2f660 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
2f670 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
2f680 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
2f690 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
2f6a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
2f6b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f6c0 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
2f6d0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
2f6e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2f6f0 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
2f700 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
2f710 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
2f720 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
2f730 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
2f740 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
2f750 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2f760 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
2f770 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
2f780 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
2f790 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
2f7a0 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
2f7b0 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
2f7c0 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
2f7d0 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
2f7e0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2f7f0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
2f800 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
2f810 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
2f820 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
2f830 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
2f840 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
2f850 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
2f860 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
2f870 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
2f880 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
2f890 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
2f8a0 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
2f8b0 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
2f8c0 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2f8d0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2f8e0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2f8f0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
2f900 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
2f910 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
2f920 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2f930 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
2f940 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
2f950 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
2f960 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
2f970 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
2f980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
2f990 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
2f9a0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2f9b0 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
2f9c0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
2f9d0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
2f9e0 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pVfs;.  int rc =
2f9f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2fa00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2fa10 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
2fa20 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20  ists = 1;       
2fa30 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fa40 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
2fa50 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
2fa60 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d    int jrnlOpen =
2fa70 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72   !!isOpen(pPager
2fa80 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72  ->jfd);..  asser
2fa90 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2faa0 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
2fab0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2fac0 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  ->fd) );.  asser
2fad0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
2fae0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
2faf0 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c  ..  assert( jrnl
2fb00 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c  Open==0 || ( sql
2fb10 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
2fb20 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
2fb30 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53  er->jfd) &.    S
2fb40 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
2fb50 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
2fb60 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69  N.  ));..  *pExi
2fb70 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  sts = 0;.  if( !
2fb80 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2fb90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
2fba0 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
2fbb0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
2fbc0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
2fbd0 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d  S, &exists);.  }
2fbe0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2fbf0 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
2fc00 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64  {.    int locked
2fc10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2fc20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d    /* True if som
2fc30 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  e process holds 
2fc40 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2fc50 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20  */..    /* Race 
2fc60 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20  condition here: 
2fc70 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   Another process
2fc80 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
2fc90 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20   holding the.   
2fca0 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44   ** the RESERVED
2fcb0 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61   lock and have a
2fcc0 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74   journal open at
2fcd0 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63   the sqlite3OsAc
2fce0 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63  cess() .    ** c
2fcf0 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74  all above, but t
2fd00 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
2fd10 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20  ournal and drop 
2fd20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a  the lock before.
2fd30 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f      ** we get to
2fd40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2fd50 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
2fd60 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
2fd70 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a  .  If that.    *
2fd80 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  * is the case, t
2fd90 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
2fda0 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73  t think there is
2fdb0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77   a hot journal w
2fdc0 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61  hen.    ** in fa
2fdd0 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65  ct there is none
2fde0 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20  .  This results 
2fdf0 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  in a false-posit
2fe00 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20  ive which will. 
2fe10 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
2fe20 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62  ith by the playb
2fe30 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69  ack routine.  Ti
2fe40 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20  cket #3883..    
2fe50 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2fe60 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
2fe70 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
2fe80 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20  d, &locked);.   
2fe90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2fea0 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b  OK && !locked ){
2feb0 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
2fec0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2fed0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2fee0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
2fef0 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  e file */..     
2ff00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ff10 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a  >tempFile==0 );.
2ff20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2ff30 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2ff40 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
2ff50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ff60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
2ff70 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2ff80 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69   is zero pages i
2ff90 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61  n size, that mea
2ffa0 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 28  ns that either (
2ffb0 31 29 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  1) the.        *
2ffc0 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72  * journal is a r
2ffd0 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72  emnant from a pr
2ffe0 69 6f 72 20 64 61 74 61 62 61 73 65 20 77 69 74  ior database wit
2fff0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
30000 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  where.        **
30010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30020 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a  le but not the j
30030 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74  ournal was delet
30040 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69  ed, or (2) the i
30050 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a  nitial.        *
30060 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
30070 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e  at populates a n
30080 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 62  ew database is b
30090 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
300a0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
300b0 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 65  either case, the
300c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
300d0 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48  n be deleted.  H
300e0 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72  owever, take car
300f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  e.        ** not
30100 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
30110 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
30120 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
30130 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20  n due to.       
30140 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   ** journal_mode
30150 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20  =PERSIST..      
30160 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
30170 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72   nPage==0 && !jr
30180 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
30190 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
301a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
301b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
301c0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
301d0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
301e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
301f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30200 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
30210 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
30220 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
30230 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
30240 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20  exclusiveMode ) 
30250 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
30260 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
30270 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
30280 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30290 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
302a0 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
302b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
302c0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
302d0 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
302e0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
302f0 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
30300 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
30310 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
30320 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30330 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
30340 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
30350 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
30360 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
30370 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
30380 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
30390 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
303a0 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
303b0 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
303c0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
303d0 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
303e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
303f0 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
30400 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
30410 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
30420 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
30430 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
30440 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
30450 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
30460 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
30470 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30480 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
30490 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
304a0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
304b0 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20  f, &f);.        
304c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
304d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
304e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
304f0 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20  8 first = 0;.   
30500 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
30510 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
30520 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a  er->jfd, (void *
30530 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a  )&first, 1, 0);.
30540 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30550 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
30560 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
30570 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
30580 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
30590 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
305a0 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c         if( !jrnl
305b0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
305c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
305d0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
305e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
305f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
30600 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d  xists = (first!=
30610 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  0);.          }e
30620 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
30630 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
30640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
30650 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20   we cannot open 
30660 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
30670 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64  rnal file in ord
30680 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20  er to see if.   
30690 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68           ** it h
306a0 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72  as a zero header
306b0 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  , that might be 
306c0 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72  due to an I/O er
306d0 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20  ror, or.        
306e0 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
306f0 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61  be due to the ra
30700 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  ce condition des
30710 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64  cribed above and
30720 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20   in.            
30730 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e  ** ticket #3883.
30740 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73    Either way, as
30750 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f  sume that the jo
30760 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20  urnal is hot..  
30770 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
30780 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c  s might be a fal
30790 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75  se positive.  Bu
307a0 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e  t if it is, then
307b0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
307c0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f   ** automatic jo
307d0 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61  urnal playback a
307e0 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68  nd recovery mech
307f0 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a  anism will deal.
30800 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
30810 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20  ith it under an 
30820 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77  EXCLUSIVE lock w
30830 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e  here we do not n
30840 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
30850 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d     ** worry so m
30860 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f  uch with race co
30870 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20  nditions..      
30880 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30890 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
308a0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
308b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
308c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
308d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
308e0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
308f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
30900 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
30910 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
30920 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
30930 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30940 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c  le..** It is ill
30950 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
30960 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 75  ite3PagerGet() u
30970 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20  ntil after this 
30980 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
30990 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  been successfull
309a0 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73  y called. If a s
309b0 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c  hared-lock is al
309c0 72 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a  ready held when.
309d0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
309e0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
309f0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
30a00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   The following o
30a10 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c  perations are al
30a20 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  so performed by 
30a30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
30a40 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65  *.**   1) If the
30a50 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
30a60 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  tly in PAGER_OPE
30a70 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b  N state (no lock
30a80 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e   held.**      on
30a90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30aa0 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74  le), then an att
30ab0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
30ac0 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20  obtain a.**     
30ad0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
30ae0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30af0 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  e. Immediately a
30b00 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a  fter obtaining.*
30b10 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45  *      the SHARE
30b20 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65  D lock, the file
30b30 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b  -system is check
30b40 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ed for a hot-jou
30b50 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68  rnal,.**      wh
30b60 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61  ich is played ba
30b70 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46  ck if present. F
30b80 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74  ollowing any hot
30b90 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20  -journal .**    
30ba0 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20    rollback, the 
30bb0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
30bc0 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61  cache are valida
30bd0 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a  ted by checking.
30be0 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61  **      the 'cha
30bf0 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65  nge-counter' fie
30c00 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ld of the databa
30c10 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61  se file header a
30c20 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61  nd.**      disca
30c30 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65  rded if they are
30c40 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76   found to be inv
30c50 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  alid..**.**   2)
30c60 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
30c70 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
30c80 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20  usive-mode, and 
30c90 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  there are curren
30ca0 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f  tly.**      no o
30cb0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
30cc0 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67  ences to any pag
30cd0 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68  es, and is in th
30ce0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a  e error state,.*
30cf0 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61  *      then an a
30d00 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
30d10 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  o clear the erro
30d20 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61  r state by disca
30d30 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  rding.**      th
30d40 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
30d50 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  e page cache and
30d60 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e   rolling back an
30d70 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  y open journal.*
30d80 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a  *      file..**.
30d90 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
30da0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
30db0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
30dc0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
30dd0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
30de0 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74   while locking t
30df0 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65  he database, che
30e00 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d  cking for a hot-
30e10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
30e20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  .** rolling back
30e30 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c   a journal file,
30e40 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
30e50 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
30e60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
30e70 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61  gerSharedLock(Pa
30e80 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30e90 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
30ea0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
30eb0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
30ec0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
30ed0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
30ee0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72  called from b-tr
30ef0 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e  ee and only when
30f00 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
30f10 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ** outstanding p
30f20 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69  ages. This impli
30f30 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
30f40 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65  r state should e
30f50 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50  ither.  ** be OP
30f60 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45  EN or READER. RE
30f70 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73  ADER is only pos
30f80 73 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67  sible if the pag
30f90 65 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20  er is or was in 
30fa0 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  .  ** exclusive 
30fb0 61 63 63 65 73 73 20 6d 6f 64 65 2e 20 20 2a 2f  access mode.  */
30fc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30fd0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
30fe0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
30ff0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
31000 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
31010 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
31020 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31030 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
31040 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
31050 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
31060 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
31070 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
31080 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
31090 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
310a0 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
310b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
310c0 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20  AGER_OPEN ){.   
310d0 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c   int bHotJournal
310e0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f   = 1;          /
310f0 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  * True if there 
31100 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75  exists a hot jou
31110 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal-file */..  
31120 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
31130 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
31140 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
31150 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ==0 || pPager->e
31160 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
31170 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 72 63 20  LOCK );..    rc 
31180 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
31190 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
311a0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  RED_LOCK);.    i
311b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
311c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
311d0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
311e0 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  =NO_LOCK || pPag
311f0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
31200 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
31210 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
31220 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
31230 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
31240 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
31250 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
31260 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
31270 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
31280 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
31290 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
312a0 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
312b0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
312c0 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
312d0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  <=SHARED_LOCK ){
312e0 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48  .      rc = hasH
312f0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
31300 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b  , &bHotJournal);
31310 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
31320 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31330 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
31340 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
31350 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a   bHotJournal ){.
31360 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
31370 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
31380 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31390 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
313a0 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ACK;.        got
313b0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
313c0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20  }..      /* Get 
313d0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
313e0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
313f0 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
31400 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
31410 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
31420 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
31430 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
31440 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
31450 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45  o the.      ** E
31460 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
31470 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
31480 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
31490 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
314a0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
314b0 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
314c0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
314d0 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
314e0 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
314f0 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
31500 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
31510 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
31520 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20  rolling the .   
31530 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
31540 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a  l back..      **
31550 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75   .      ** Becau
31560 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
31570 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
31580 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
31590 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  ed, any.      **
315a0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61   other process a
315b0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63  ttempting to acc
315c0 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
315d0 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74   file will get t
315e0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  o .      ** this
315f0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
31600 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f  de and fail to o
31610 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
31620 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20  CLUSIVE lock .  
31630 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61      ** on the da
31640 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
31650 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55     **.      ** U
31660 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
31670 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  is in locking_mo
31680 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
31690 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20  e, the lock is. 
316a0 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64       ** downgrad
316b0 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43  ed to SHARED_LOC
316c0 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  K before this fu
316d0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
316e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
316f0 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
31700 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
31710 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  E_LOCK);.      i
31720 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31730 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
31740 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
31750 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  . .      /* If i
31760 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
31770 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69   open and the fi
31780 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  le exists on dis
31790 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20  k, open the .   
317a0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f     ** journal fo
317b0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
317c0 65 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73  ess. Write acces
317d0 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
317e0 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  cause .      ** 
317f0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
31800 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
31810 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
31820 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a  l be kept open .
31830 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73        ** and pos
31840 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
31850 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
31860 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69  er on. Also, wri
31870 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20  te-access .     
31880 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72   ** is usually r
31890 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c  equired to final
318a0 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
318b0 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  in journal_mode=
318c0 70 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a  persist .      *
318d0 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f  * mode (and also
318e0 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   for journal_mod
318f0 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f  e=truncate on so
31900 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20  me systems)..   
31910 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
31920 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
31930 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74  es not exist, it
31940 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74   usually means t
31950 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20  hat some .      
31960 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
31970 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67  ion managed to g
31980 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69  et in and roll i
31990 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20  t back before . 
319a0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e       ** this con
319b0 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64  nection obtained
319c0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
319d0 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69  ock above. Or, i
319e0 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  t .      ** may 
319f0 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61  mean that the pa
31a00 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65  ger was in the e
31a10 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
31a20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75  this.      ** fu
31a30 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
31a40 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
31a50 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
31a60 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  exist..      */.
31a70 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65        if( !isOpe
31a80 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
31a90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
31aa0 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
31ab0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
31ac0 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  s;.        int b
31ad0 45 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20  Exists;         
31ae0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
31af0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
31b00 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  sts */.        r
31b10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
31b20 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20  ess(.           
31b30 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
31b40 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
31b50 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
31b60 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20  bExists);.      
31b70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31b80 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29  _OK && bExists )
31b90 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
31ba0 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
31bb0 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
31bc0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
31bd0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
31be0 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
31bf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
31c00 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
31c10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
31c20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
31c30 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
31c40 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
31c50 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
31c60 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
31c70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31c80 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
31c90 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20  ->jfd) );.      
31ca0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31cb0 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51  TE_OK && fout&SQ
31cc0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
31cd0 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
31ce0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
31cf0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
31d00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31d10 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
31d20 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
31d30 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31d40 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50    }. .      /* P
31d50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
31d60 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
31d70 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
31d80 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  se write.      *
31d90 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
31da0 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
31db0 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61  ck. Purge the ca
31dc0 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20  che before.     
31dd0 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   ** playing back
31de0 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   the hot-journal
31df0 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27   so that we don'
31e00 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20  t end up with.  
31e10 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73      ** an incons
31e20 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53  istent cache.  S
31e30 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  ync the hot jour
31e40 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
31e50 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62  ng.      ** it b
31e60 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72  ack since the pr
31e70 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68  ocess that crash
31e80 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20  ed and left the 
31e90 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot journal.    
31ea0 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69    ** probably di
31eb0 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e  d not sync it an
31ec0 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65  d we are require
31ed0 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63  d to always sync
31ee0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
31ef0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
31f00 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20  ying it back..  
31f10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
31f20 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
31f30 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
31f40 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
31f50 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
31f60 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48   rc = pagerSyncH
31f70 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
31f80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
31f90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31fa0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
31fb0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
31fc0 61 67 65 72 2c 20 21 70 50 61 67 65 72 2d 3e 74  ager, !pPager->t
31fd0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  empFile);.      
31fe0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
31ff0 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
32000 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32010 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
32020 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
32030 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  e ){.        pag
32040 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
32050 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
32060 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
32070 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32080 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
32090 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
320a0 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  aken if an error
320b0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
320c0 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20  ying to open.   
320d0 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20       ** or roll 
320e0 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
320f0 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  al while holding
32100 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
32110 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  ck. The.        
32120 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  ** pager_unlock(
32130 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  ) routine will b
32140 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
32150 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c  returning to unl
32160 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ock.        ** t
32170 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  he file. If the 
32180 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66  unlock attempt f
32190 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72  ails, then Pager
321a0 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20  .eLock must be. 
321b0 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f         ** set to
321c0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73   UNKNOWN_LOCK (s
321d0 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
321e0 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
321f0 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a   for .        **
32200 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62   UNKNOWN_LOCK ab
32210 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  ove for an expla
32220 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20  nation). .      
32230 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
32240 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  In order to get 
32250 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74  pager_unlock() t
32260 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50  o do this, set P
32270 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20  ager.eState to. 
32280 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f         ** PAGER_
32290 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20  ERROR now. This 
322a0 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
322b0 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61  counted as a tra
322c0 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nsition.        
322d0 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ** to ERROR stat
322e0 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64  e in the state d
322f0 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f  iagram at the to
32300 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a  p of this file,.
32310 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65          ** since
32320 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
32330 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70  e same call to p
32340 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
32350 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20  ll very.        
32360 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73  ** shortly trans
32370 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ition the pager 
32380 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50  object to the OP
32390 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e  EN state. Callin
323a0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73  g.        ** ass
323b0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
323c0 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77  ) would fail now
323d0 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e  , as it should n
323e0 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20  ot be possible. 
323f0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
32400 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
32410 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65  hen there are ze
32420 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ro outstanding p
32430 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  age .        ** 
32440 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20  references..    
32450 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
32460 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
32470 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
32480 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
32490 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
324a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
324b0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
324c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
324d0 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
324e0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
324f0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
32500 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
32510 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e && pPager->eLo
32520 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  ck>SHARED_LOCK).
32530 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
32540 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
32550 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61  >tempFile && pPa
32560 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
32570 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  edLock ){.      
32580 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
32590 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
325a0 20 61 63 71 75 69 72 65 64 20 74 68 65 6e 20 63   acquired then c
325b0 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a  heck to.      **
325c0 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
325d0 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  base has been mo
325e0 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
325f0 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
32600 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66  nged,.      ** f
32610 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20  lush the cache. 
32620 20 54 68 65 20 68 61 73 48 65 6c 64 53 68 61 72   The hasHeldShar
32630 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76  edLock flag prev
32640 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20  ents this from. 
32650 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e       ** occurrin
32660 67 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69  g on the very fi
32670 72 73 74 20 61 63 63 65 73 73 20 74 6f 20 61 20  rst access to a 
32680 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74  file, in order t
32690 6f 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a  o save a.      *
326a0 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73  * single unneces
326b0 73 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65  sary sqlite3OsRe
326c0 61 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65  ad() call at the
326d0 20 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20   start-up..     
326e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
326f0 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 61 72  abase changes ar
32700 65 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  e detected by lo
32710 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
32720 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
32730 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
32740 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
32750 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
32760 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
32770 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33  are.      ** a 3
32780 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68  2-bit counter th
32790 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  at is incremente
327a0 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e  d with each chan
327b0 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  ge.  The.      *
327c0 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
327d0 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
327e0 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
327f0 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  nge when.      *
32800 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
32810 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  use..      ** . 
32820 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
32830 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
32840 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
32850 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
32860 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20  ot be .      ** 
32870 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
32880 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
32890 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
328a0 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
328b0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
328c0 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
328d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f     */.      Pgno
328e0 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20   nPage = 0;.    
328f0 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
32900 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
32910 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a  >dbFileVers)];..
32920 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
32930 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
32940 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
32950 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
32960 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66  ailed;..      if
32970 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
32980 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
32990 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20  KVERS %p %d\n", 
329a0 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64  pPager, sizeof(d
329b0 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20  bFileVers)));.  
329c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
329d0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
329e0 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
329f0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
32a00 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
32a10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32a20 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
32a30 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
32a40 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
32a50 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
32a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
32a70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
32a80 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
32a90 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
32aa0 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
32ab0 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
32ac0 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
32ad0 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
32ae0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
32af0 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
32b00 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
32b10 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
32b20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64    /* Unmap the d
32b30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
32b40 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
32b50 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65  t external proce
32b60 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  sses.        ** 
32b70 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74  may have truncat
32b80 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
32b90 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78  file and then ex
32ba0 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20  tended it back. 
32bb0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73         ** to its
32bc0 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77   original size w
32bd0 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
32be0 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e  s was not holdin
32bf0 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  g a lock..      
32c00 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
32c10 65 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73  e there may exis
32c20 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d  t a Pager.pMap m
32c30 61 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65  apping that appe
32c40 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ars.        ** t
32c50 6f 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73  o be the right s
32c60 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61  ize but is not a
32c70 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41  ctually valid. A
32c80 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20  void this.      
32c90 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79    ** possibility
32ca0 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68   by unmapping th
32cb0 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20  e db here. */.  
32cc0 20 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54        if( USEFET
32cd0 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  CH(pPager) ){.  
32ce0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
32cf0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
32d00 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >fd, 0, 0);.    
32d10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32d20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
32d30 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69  here is a WAL fi
32d40 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
32d50 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73  ystem, open this
32d60 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c   database in WAL
32d70 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74  .    ** mode. Ot
32d80 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c  herwise, the fol
32d90 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lowing function 
32da0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
32db0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
32dc0 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
32dd0 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a  resent(pPager);.
32de0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32df0 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65  MIT_WAL.    asse
32e00 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
32e10 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
32e20 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20  E_OK );.#endif. 
32e30 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
32e40 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
32e50 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
32e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
32e70 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
32e80 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
32e90 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
32ea0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
32eb0 70 46 69 6c 65 3d 3d 30 20 26 26 20 70 50 61 67  pFile==0 && pPag
32ec0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32ed0 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51  R_OPEN && rc==SQ
32ee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
32ef0 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
32f00 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  nt(pPager, &pPag
32f10 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
32f20 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
32f30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32f40 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
32f50 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
32f60 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
32f70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
32f80 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
32f90 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65  GER_OPEN );.  }e
32fa0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
32fb0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
32fc0 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67  READER;.    pPag
32fd0 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
32fe0 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20  dLock = 1;.  }. 
32ff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
33000 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
33010 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
33020 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
33030 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
33040 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
33050 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
33060 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
33070 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
33080 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
33090 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
330a0 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
330b0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
330c0 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
330d0 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
330e0 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
330f0 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
33100 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
33110 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
33120 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
33130 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
33140 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
33150 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
33160 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26  r->nMmapOut==0 &
33170 26 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  & (sqlite3Pcache
33180 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
33190 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b  >pPCache)==0) ){
331a0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
331b0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
331c0 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
331d0 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65  * Acquire a refe
331e0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75  rence to page nu
331f0 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67  mber pgno in pag
33200 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67  er pPager (a pag
33210 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68  e.** reference h
33220 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29  as type DbPage*)
33230 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
33240 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ed reference is 
33250 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
33260 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73   obtained, it is
33270 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61   copied to *ppPa
33280 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ge and SQLITE_OK
33290 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
332a0 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
332b0 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  d page is alread
332c0 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
332d0 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
332e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
332f0 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
33300 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
33310 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
33320 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72   data.** read fr
33330 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
33340 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61  file. In some ca
33350 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20  ses, the pcache 
33360 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68  module may.** ch
33370 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f  oose not to allo
33380 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
33390 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72  object and may r
333a0 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
333b0 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20  .** object with 
333c0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
333d0 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
333e0 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
333f0 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
33400 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
33410 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
33420 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  s the .** first 
33430 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
33440 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
33450 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72  y. If the page r
33460 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20  equested is .** 
33470 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
33480 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66  ache when this f
33490 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
334a0 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72  d, then the extr
334b0 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66  a.** data is lef
334c0 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
334d0 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
334e0 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a   was last used..
334f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
33500 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73  abase image is s
33510 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
33520 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f  requested page o
33530 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a  r if a .** non-z
33540 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73  ero value is pas
33550 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e  sed as the noCon
33560 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61  tent parameter a
33570 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
33580 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
33590 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
335a0 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
335b0 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
335c0 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
335d0 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
335e0 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
335f0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
33600 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
33610 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
33620 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
33630 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
33640 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
33650 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
33660 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
33670 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
33680 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 63  occurs in two sc
33690 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20  enarios:.**.**  
336a0 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67   a) When reading
336b0 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
336c0 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  f page from the 
336d0 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a  database, and.**
336e0 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20  .**   b) When a 
336f0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69  savepoint is bei
33700 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  ng rolled back a
33710 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f  nd we need to lo
33720 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77  ad.**      a new
33730 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63   page into the c
33740 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65  ache to be fille
33750 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20  d with the data 
33760 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f  read.**      fro
33770 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  m the savepoint 
33780 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
33790 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
337a0 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
337b0 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a  ta returned is z
337c0 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66  eroed instead of
337d0 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66  .** being read f
337e0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
337f0 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
33800 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70  the bits corresp
33810 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e  onding.** to pgn
33820 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  o in Pager.pInJo
33830 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66  urnal (bitvec of
33840 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77   pages already w
33850 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
33860 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
33870 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
33880 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
33890 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e  nt bitvecs of an
338a0 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f  y open.** savepo
338b0 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68  ints are set. Th
338c0 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
338d0 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69  page is made wri
338e0 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20  table at any.** 
338f0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
33900 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c  ure, using a cal
33910 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
33920 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f  rWrite(), its co
33930 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e  ntents.** will n
33940 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  ot be journaled.
33950 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a   This saves IO..
33960 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
33970 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
33980 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
33990 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
339a0 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
339b0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
339c0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
339d0 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
339e0 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
339f0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
33a00 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
33a10 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
33a20 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
33a30 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
33a40 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
33a50 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
33a60 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
33a70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
33a80 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
33a90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
33aa0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
33ab0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
33ac0 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
33ad0 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
33ae0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
33af0 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
33b00 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
33b10 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
33b20 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
33b30 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
33b40 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
33b50 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
33b60 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
33b70 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
33b80 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
33b90 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
33ba0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
33bb0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
33bc0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 0a  qlite3PagerGet(.
33bd0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
33be0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
33bf0 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
33c00 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
33c10 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
33c20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
33c30 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
33c40 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
33c50 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
33c60 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
33c70 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
33c80 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
33c90 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
33ca0 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  _XXX flags */.){
33cb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33cc0 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a  TE_OK;.  PgHdr *
33cd0 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69  pPg = 0;.  u32 i
33ce0 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  Frame = 0;      
33cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
33d00 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ame to read from
33d10 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63   WAL file */.  c
33d20 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  onst int noConte
33d30 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  nt = (flags & PA
33d40 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
33d50 54 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20  T);..  /* It is 
33d60 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73  acceptable to us
33d70 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d  e a read-only (m
33d80 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e  map) page for an
33d90 79 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20  y page except.  
33da0 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65  ** page 1 if the
33db0 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  re is no write-t
33dc0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20  ransaction open 
33dd0 6f 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52  or the ACQUIRE_R
33de0 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61  EADONLY.  ** fla
33df0 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20  g was specified 
33e00 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41  by the caller. A
33e10 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68  nd so long as th
33e20 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20  e db is not a . 
33e30 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72   ** temporary or
33e40 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
33e50 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  ase.  */.  const
33e60 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28   int bMmapOk = (
33e70 70 67 6e 6f 3e 31 20 26 26 20 55 53 45 46 45 54  pgno>1 && USEFET
33e80 43 48 28 70 50 61 67 65 72 29 0a 20 20 20 26 26  CH(pPager).   &&
33e90 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
33ea0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c  ==PAGER_READER |
33eb0 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  | (flags & PAGER
33ec0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a  _GET_READONLY)).
33ed0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
33ee0 53 5f 43 4f 44 45 43 0a 20 20 20 26 26 20 70 50  S_CODEC.   && pP
33ef0 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a  ager->xCodec==0.
33f00 23 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20 2f  #endif.  );..  /
33f10 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e  * Optimization n
33f20 6f 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65  ote:  Adding the
33f30 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20   "pgno<=1" term 
33f40 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22  before "pgno==0"
33f50 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77   here.  ** allow
33f60 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f  s the compiler o
33f70 70 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73  ptimizer to reus
33f80 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
33f90 20 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20   the "pgno>1".  
33fa0 2a 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20 70  ** test in the p
33fb0 72 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e  revious statemen
33fc0 74 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73  t, and avoid tes
33fd0 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20  ting pgno==0 in 
33fe0 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20  the.  ** common 
33ff0 63 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20  case where pgno 
34000 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69  is large. */.  i
34010 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67  f( pgno<=1 && pg
34020 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
34030 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
34040 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
34050 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
34060 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
34070 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
34080 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
34090 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
340a0 20 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65   assert( noConte
340b0 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b  nt==0 || bMmapOk
340c0 3d 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ==0 );..  assert
340d0 28 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c  ( pPager->hasHel
340e0 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29  dSharedLock==1 )
340f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
34100 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
34110 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75  rror state, retu
34120 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65  rn an error imme
34130 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f  diately. .  ** O
34140 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73  therwise, reques
34150 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  t the page from 
34160 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72  the PCache layer
34170 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
34180 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
34190 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
341a0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
341b0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
341c0 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70  if( bMmapOk && p
341d0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
341e0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
341f0 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
34200 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
34210 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  l, pgno, &iFrame
34220 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
34230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
34240 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34250 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
34260 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69  if( bMmapOk && i
34270 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Frame==0 ){.    
34280 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
34290 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  0;..      rc = s
342a0 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70 50  qlite3OsFetch(pP
342b0 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20  ager->fd, .     
342c0 20 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f 2d       (i64)(pgno-
342d0 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67  1) * pPager->pag
342e0 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70  eSize, pPager->p
342f0 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61 0a  ageSize, &pData.
34300 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20        );..      
34310 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34320 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20  K && pData ){.  
34330 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
34340 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52  ->eState>PAGER_R
34350 45 41 44 45 52 20 7c 7c 20 70 50 61 67 65 72 2d  EADER || pPager-
34360 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
34370 20 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c         pPg = sql
34380 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
34390 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
343a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
343b0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
343c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
343d0 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
343e0 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
343f0 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20  pData, &pPg);.  
34400 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
34420 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
34430 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31  fd, (i64)(pgno-1
34440 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  )*pPager->pageSi
34450 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  ze, pData);.    
34460 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
34470 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20  ( pPg ){.       
34480 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
34490 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
344a0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
344b0 70 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 72  pPg;.          r
344c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
344d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
344e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
344f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34500 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
34510 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34520 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
34530 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
34540 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42  _pcache_page *pB
34550 61 73 65 3b 0a 20 20 20 20 20 20 70 42 61 73 65  ase;.      pBase
34560 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
34570 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
34580 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b  Cache, pgno, 3);
34590 0a 20 20 20 20 20 20 69 66 28 20 70 42 61 73 65  .      if( pBase
345a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
345b0 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
345c0 65 46 65 74 63 68 53 74 72 65 73 73 28 70 50 61  eFetchStress(pPa
345d0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
345e0 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20 20 20  no, &pBase);.   
345f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34600 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61  ITE_OK ) goto pa
34610 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34620 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 61  .        if( pBa
34630 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  se==0 ){.       
34640 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
34650 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
34660 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
34670 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
34680 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
34690 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
346a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
346b0 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20    pPg = *ppPage 
346c0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
346d0 65 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65  etchFinish(pPage
346e0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
346f0 2c 20 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20  , pBase);.      
34700 61 73 73 65 72 74 28 20 70 50 67 21 3d 30 20 29  assert( pPg!=0 )
34710 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
34720 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34730 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
34740 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  r the call to sq
34750 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
34760 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  () returned an e
34770 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20  rror or the.    
34780 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72  ** pager was alr
34790 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
347a0 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
347b0 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
347c0 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65  alled..    ** Se
347d0 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a  t pPg to 0 and j
347e0 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70  ump to the excep
347f0 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a  tion handler.  *
34800 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  /.    pPg = 0;. 
34810 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
34820 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20  quire_err;.  }. 
34830 20 61 73 73 65 72 74 28 20 70 50 67 3d 3d 28 2a   assert( pPg==(*
34840 70 70 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  ppPage) );.  ass
34850 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  ert( pPg->pgno==
34860 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
34870 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
34880 50 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50  Pager || pPg->pP
34890 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  ager==0 );..  if
348a0 28 20 70 50 67 2d 3e 70 50 61 67 65 72 20 26 26  ( pPg->pPager &&
348b0 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
348c0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
348d0 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
348e0 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
348f0 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
34900 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
34910 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
34920 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
34930 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  o.  */.    asser
34940 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d  t( pgno<=PAGER_M
34950 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21  AX_PGNO && pgno!
34960 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
34970 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50  Pager) );.    pP
34980 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
34990 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20  R_STAT_HIT]++;. 
349a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
349b0 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OK;..  }else{. 
349c0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
349d0 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65  cache has create
349e0 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74  d a new page. It
349f0 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20  s content needs 
34a00 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e  to .    ** be in
34a10 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a  itialized.  */..
34a20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
34a30 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f  = pPager;..    /
34a40 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
34a50 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
34a60 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
34a70 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
34a80 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  ge.    ** number
34a90 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
34aa0 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65  is, or the unuse
34ab0 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20  d locking-page, 
34ac0 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f  is requested. */
34ad0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  .    if( pgno>PA
34ae0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
34af0 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
34b00 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
34b10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
34b20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
34b30 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
34b40 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34b50 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
34b60 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
34b70 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  fd) || !MEMDB );
34b80 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e  .    if( !isOpen
34b90 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
34ba0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
34bb0 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74  gno || noContent
34bc0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
34bd0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
34be0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
34bf0 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
34c00 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
34c10 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
34c30 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
34c40 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65        /* Failure
34c50 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73   to set the bits
34c60 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61   in the InJourna
34c70 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73  l bit-vectors is
34c80 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20   benign..       
34c90 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65   ** It merely me
34ca0 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68  ans that we migh
34cb0 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20  t do some extra 
34cc0 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  work to journal 
34cd0 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  a .        ** pa
34ce0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
34cf0 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
34d00 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65  naled.  Neverthe
34d10 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20  less, be sure . 
34d20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73         ** to tes
34d30 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  t the case where
34d40 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20   a malloc error 
34d50 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
34d60 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20  ing to set .    
34d70 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20      ** a bit in 
34d80 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20  a bit vector..  
34d90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34da0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
34db0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
34dc0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70       if( pgno<=p
34dd0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
34de0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  e ){.          T
34df0 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
34e00 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
34e10 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
34e20 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  nal, pgno);.    
34e30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34e40 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
34e50 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
34e60 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
34e70 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65  rc = ) addToSave
34e80 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
34e90 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
34ea0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
34eb0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
34ec0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
34ed0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
34ee0 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
34ef0 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44    memset(pPg->pD
34f00 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ata, 0, pPager->
34f10 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
34f20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
34f30 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
34f40 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
34f50 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
34f60 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
34f70 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30  r) && bMmapOk==0
34f80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
34f90 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
34fa0 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
34fb0 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  l, pgno, &iFrame
34fc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34fd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
34fe0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34ff0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
35000 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
35010 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
35020 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
35030 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
35040 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20  AT_MISS]++;.    
35050 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
35060 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a  e(pPg, iFrame);.
35070 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
35080 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35090 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
350a0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
350b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
350c0 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
350d0 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
350e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
350f0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
35100 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  r:.  assert( rc!
35110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
35120 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73  if( pPg ){.    s
35130 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
35140 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
35150 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
35160 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70  (pPager);..  *pp
35170 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Page = 0;.  retu
35180 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
35190 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
351a0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
351b0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
351c0 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
351d0 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
351e0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
351f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
35200 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
35210 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
35220 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  s not in cache. 
35230 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
35240 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
35250 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
35260 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
35270 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
35280 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
35290 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
352a0 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
352b0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
352c0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
352d0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
352e0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
352f0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
35300 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
35310 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
35320 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
35330 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
35340 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
35350 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
35360 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
35370 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
35380 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
35390 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63  {.  sqlite3_pcac
353a0 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a  he_page *pPage;.
353b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
353c0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
353d0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73   pgno!=0 );.  as
353e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50  sert( pPager->pP
353f0 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50  Cache!=0 );.  pP
35400 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  age = sqlite3Pca
35410 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
35420 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
35430 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  0);.  assert( pP
35440 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  age==0 || pPager
35450 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
35460 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ock );.  if( pPa
35470 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ge==0 ) return 0
35480 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
35490 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e  e3PcacheFetchFin
354a0 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ish(pPager->pPCa
354b0 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65  che, pgno, pPage
354c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
354d0 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
354e0 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ence..**.** If t
354f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
35500 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
35510 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
35520 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
35530 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
35540 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
35550 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
35560 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
35570 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
35580 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
35590 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
355a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
355b0 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
355c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
355d0 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44  erUnrefNotNull(D
355e0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
355f0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
35600 61 73 73 65 72 74 28 20 70 50 67 21 3d 30 20 29  assert( pPg!=0 )
35610 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50 67  ;.  pPager = pPg
35620 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
35630 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
35640 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70  DR_MMAP ){.    p
35650 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
35660 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65  ge(pPg);.  }else
35670 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
35680 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
35690 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
356a0 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
356b0 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  r);.}.void sqlit
356c0 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
356d0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
356e0 20 70 50 67 20 29 20 73 71 6c 69 74 65 33 50 61   pPg ) sqlite3Pa
356f0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
35700 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pPg);.}../*.** T
35710 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
35720 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74  called at the st
35730 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69  art of every wri
35740 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
35750 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c  ** There must al
35760 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
35770 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
35780 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
35790 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77  abase .** file w
357a0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
357b0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
357c0 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
357d0 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
357e0 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69  r pPager and wri
357f0 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  te a journal hea
35800 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  der.** to the st
35810 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68  art of it. If th
35820 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
35830 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20  avepoints, open 
35840 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
35850 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73  ** as well. This
35860 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
35870 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  y used when the 
35880 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
35890 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64  being .** opened
358a0 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c   to write a roll
358b0 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74  back log for a t
358c0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69  ransaction. It i
358d0 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77  s not used .** w
358e0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f  hen opening a ho
358f0 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  t journal file t
35900 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  o roll it back..
35910 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
35920 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72  rnal file is alr
35930 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74  eady open (as it
35940 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75   may be in exclu
35950 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74  sive mode),.** t
35960 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
35970 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20  n just writes a 
35980 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
35990 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
359a0 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70  he.** already op
359b0 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  en file. .**.** 
359c0 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
359d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
359e0 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  is opened by thi
359f0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a  s function, the.
35a00 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
35a10 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63  nal bitvec struc
35a20 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
35a30 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
35a40 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
35a50 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
35a60 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65  ssful. Otherwise
35a70 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
35a80 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65  ITE_NOMEM if the
35a90 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f   attempt to allo
35aa0 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f  cate Pager.pInJo
35ab0 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
35ac0 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  .** an IO error 
35ad0 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  code if opening 
35ae0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  or writing the j
35af0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
35b00 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
35b10 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
35b20 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
35b30 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
35b40 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
35b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b60 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
35b70 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
35b80 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
35b90 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20  pPager->pVfs;   
35ba0 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
35bb0 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f  f vfs pointer */
35bc0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
35bd0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
35be0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
35bf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
35c00 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
35c10 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
35c20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
35c30 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
35c40 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79  .  /* If already
35c50 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
35c60 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
35c70 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
35c80 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20  But on.  ** the 
35c90 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73  other hand, this
35ca0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
35cb0 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61  r called if we a
35cc0 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20  re already in.  
35cd0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  ** an error stat
35ce0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  e. */.  if( NEVE
35cf0 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
35d00 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
35d10 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
35d20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
35d30 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67  (pPager) && pPag
35d40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
35d50 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
35d60 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50  DE_OFF ){.    pP
35d70 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
35d80 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
35d90 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
35da0 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  bSize);.    if( 
35db0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
35dc0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  al==0 ){.      r
35dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
35de0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
35df0 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68   .    /* Open th
35e00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
35e10 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
35e20 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20  ady open. */.   
35e30 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
35e40 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
35e50 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
35e60 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
35e70 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
35e80 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20  MORY ){.        
35e90 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
35ea0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
35eb0 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d);.      }else{
35ec0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61  .        int fla
35ed0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
35ee0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
35ef0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
35f00 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 69 6c         int nSpil
35f10 6c 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  l;..        if( 
35f20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
35f30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
35f40 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f  ags |= (SQLITE_O
35f50 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
35f60 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
35f70 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  MP_JOURNAL);.   
35f80 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20         nSpill = 
35f90 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53  sqlite3Config.nS
35fa0 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20  tmtSpill;.      
35fb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35fc0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
35fd0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
35fe0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
35ff0 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75 66  nSpill = jrnlBuf
36000 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ferSize(pPager);
36010 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36020 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f 2a       .        /*
36030 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
36040 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20   database still 
36050 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
36060 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65 6e  e as it did when
36070 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77  .        ** it w
36080 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  as originally op
36090 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ened. */.       
360a0 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49 73   rc = databaseIs
360b0 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b  Unmoved(pPager);
360c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
360d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
360e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
360f0 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 20  ite3JournalOpen 
36100 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
36110 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
36120 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
36130 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 70 69  jfd, flags, nSpi
36140 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  ll.          );.
36150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36160 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
36170 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
36180 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
36190 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  jfd) );.    }.  
361a0 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
361b0 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
361c0 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
361d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
361e0 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d open .    ** t
361f0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
36200 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  f necessary..   
36210 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
36220 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36230 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
36240 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  k if all of thes
36250 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71  e are really req
36260 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
36270 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
36280 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
36290 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
362a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
362b0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
362c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
362d0 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  alHdr = 0;.     
362e0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
362f0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
36300 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
36310 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36320 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
36330 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
36340 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
36350 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
36360 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c  urnal = 0;.  }el
36370 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
36380 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36390 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
363a0 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65  KED );.    pPage
363b0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
363c0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
363d0 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  D;.  }..  return
363e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
363f0 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  gin a write-tran
36400 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
36410 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f  pecified pager o
36420 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20  bject. If a .** 
36430 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
36440 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
36450 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20  en opened, this 
36460 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
36470 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
36480 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e  e exFlag argumen
36490 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  t is false, then
364a0 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
364b0 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  t a RESERVED.** 
364c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
364d0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78  base file. If ex
364e0 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
364f0 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
36500 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53  ast.** an EXCLUS
36510 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63  IVE lock. If suc
36520 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  h a lock is alre
36530 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63  ady held, no loc
36540 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  king .** functio
36550 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65  ns need be calle
36560 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
36570 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
36580 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ument is non-zer
36590 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d  o, then any sub-
365a0 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a  journal opened.*
365b0 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  * within this tr
365c0 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
365d0 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69  e opened as an i
365e0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54  n-memory file. T
365f0 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66  his.** has no ef
36600 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d  fect if the sub-
36610 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61  journal is alrea
36620 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74  dy opened (as it
36630 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20   may be when.** 
36640 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
36650 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66  sive mode) or if
36660 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
36670 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
36680 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  e a.** sub-journ
36690 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49  al. If the subjI
366a0 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
366b0 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61   is zero, then a
366c0 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73  ny required.** s
366d0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d  ub-journal is im
366e0 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d  plemented in-mem
366f0 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73  ory if pPager is
36700 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
36710 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75  tabase, .** or u
36720 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79  sing a temporary
36730 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e   file otherwise.
36740 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
36750 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20  agerBegin(Pager 
36760 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46  *pPager, int exF
36770 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d  lag, int subjInM
36780 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63  emory){.  int rc
36790 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
367a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
367b0 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70 50  Code ) return pP
367c0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
367d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
367e0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
367f0 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d  EADER && pPager-
36800 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52  >eState<PAGER_ER
36810 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ROR );.  pPager-
36820 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20  >subjInMemory = 
36830 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  (u8)subjInMemory
36840 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ;..  if( ALWAYS(
36850 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36860 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b  PAGER_READER) ){
36870 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
36880 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
36890 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  =0 );..    if( p
368a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
368b0 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
368c0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
368d0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
368e0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
368f0 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a  clusive, and an.
36900 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
36910 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
36920 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
36930 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74  lready held, obt
36940 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ain it now..    
36950 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
36960 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
36970 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
36980 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
36990 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31  pPager->pWal, -1
369a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
369b0 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
369c0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
369d0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
369e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
369f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
36a00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
36a10 20 7d 0a 20 20 20 20 20 20 20 20 28 76 6f 69 64   }.        (void
36a20 29 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75  )sqlite3WalExclu
36a30 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
36a40 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20  >pWal, 1);.     
36a50 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61   }..      /* Gra
36a60 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  b the write lock
36a70 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   on the log file
36a80 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
36a90 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20   upgrade to.    
36aa0 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52    ** PAGER_RESER
36ab0 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72  VED state. Other
36ac0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
36ad0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
36ae0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
36af0 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64  ** The busy-hand
36b00 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b  ler is not invok
36b10 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f  ed if another co
36b20 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  nnection already
36b30 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  .      ** holds 
36b40 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20  the write-lock. 
36b50 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  If possible, the
36b60 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
36b70 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20  l call it..     
36b80 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
36b90 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
36ba0 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  iteTransaction(p
36bb0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
36bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
36bd0 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52  * Obtain a RESER
36be0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
36bf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
36c00 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72  f the exFlag par
36c10 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20  ameter.      ** 
36c20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d  is true, then im
36c30 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64  mediately upgrad
36c40 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43  e this to an EXC
36c50 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
36c60 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68  .      ** busy-h
36c70 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
36c80 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e  can be used when
36c90 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68   upgrading to th
36ca0 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20  e EXCLUSIVE.    
36cb0 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e    ** lock, but n
36cc0 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e  ot when obtainin
36cd0 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  g the RESERVED l
36ce0 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ock..      */.  
36cf0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
36d00 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53  ckDb(pPager, RES
36d10 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
36d20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36d30 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29  E_OK && exFlag )
36d40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
36d50 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
36d60 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
36d70 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
36d80 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
36d90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36da0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  ){.      /* Chan
36db0 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43  ge to WRITER_LOC
36dc0 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20  KED state..     
36dd0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c   **.      ** WAL
36de0 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65 72   mode sets Pager
36df0 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47 45 52  .eState to PAGER
36e00 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f  _WRITER_LOCKED o
36e10 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  r CACHEMOD.     
36e20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20   ** when it has 
36e30 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  an open transact
36e40 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74  ion, but never t
36e50 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53  o DBMOD or FINIS
36e60 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  HED..      ** Th
36e70 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
36e80 20 74 68 6f 73 65 20 73 74 61 74 65 73 20 74 68   those states th
36e90 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62  e code to roll b
36ea0 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  ack savepoint . 
36eb0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
36ec0 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61  ions may copy da
36ed0 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ta from the sub-
36ee0 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65  journal into the
36ef0 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20   database .     
36f00 20 2a 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c   ** file as well
36f10 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67   as into the pag
36f20 65 20 63 61 63 68 65 2e 20 57 68 69 63 68 20 77  e cache. Which w
36f30 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63  ould be incorrec
36f40 74 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57  t in .      ** W
36f50 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a  AL mode..      *
36f60 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
36f70 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
36f80 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20  RITER_LOCKED;.  
36f90 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
36fa0 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
36fb0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
36fc0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
36fd0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
36fe0 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
36ff0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70  ->dbOrigSize = p
37000 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
37010 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
37020 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
37030 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
37040 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
37050 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37060 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
37070 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
37080 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
37090 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
370a0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
370b0 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
370c0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
370d0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
370e0 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
370f0 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25  (("TRANSACTION %
37100 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
37110 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72  ager)));.  retur
37120 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
37130 72 69 74 65 20 70 61 67 65 20 70 50 67 20 6f 6e  rite page pPg on
37140 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
37150 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
37160 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  al..*/.static SQ
37170 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
37180 74 20 70 61 67 65 72 41 64 64 50 61 67 65 54 6f  t pagerAddPageTo
37190 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c 28  RollbackJournal(
371a0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
371b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
371c0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
371d0 74 20 72 63 3b 0a 20 20 75 33 32 20 63 6b 73 75  t rc;.  u32 cksu
371e0 6d 3b 0a 20 20 63 68 61 72 20 2a 70 44 61 74 61  m;.  char *pData
371f0 32 3b 0a 20 20 69 36 34 20 69 4f 66 66 20 3d 20  2;.  i64 iOff = 
37200 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
37210 66 66 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f  ff;..  /* We sho
37220 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
37230 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
37240 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
37250 74 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  t.  ** contains 
37260 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
37270 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
37280 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
37290 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20  es.  ** that we 
372a0 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 61 73 73  do not. */.  ass
372b0 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
372c0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
372d0 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65  ager) );..  asse
372e0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
372f0 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e  nalHdr<=pPager->
37300 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
37310 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
37320 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e  Pg->pData, pPg->
37330 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
37340 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
37350 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 63 6b  T, pData2);.  ck
37360 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
37370 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
37380 44 61 74 61 32 29 3b 0a 0a 20 20 2f 2a 20 45 76  Data2);..  /* Ev
37390 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64  en if an IO or d
373a0 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63  iskfull error oc
373b0 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e  curs while journ
373c0 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  alling the.  ** 
373d0 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63  page in the bloc
373e0 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65  k above, set the
373f0 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20   need-sync flag 
37400 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20  for the page..  
37410 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
37420 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
37430 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
37440 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
37450 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e    ** playback_on
37460 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68  e_page() will th
37470 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  ink that the pag
37480 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  e needs to be re
37490 73 74 6f 72 65 64 0a 20 20 2a 2a 20 69 6e 20 74  stored.  ** in t
374a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
374b0 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65  . And if an IO e
374c0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
374d0 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 2a 2a  e doing so,.  **
374e0 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e   then corruption
374f0 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 2a   may follow..  *
37500 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c  /.  pPg->flags |
37510 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
37520 43 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  C;..  rc = write
37530 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
37540 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70  fd, iOff, pPg->p
37550 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
37560 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
37570 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
37580 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
37590 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
375a0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
375b0 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 69  ze, iOff+4);.  i
375c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
375d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
375e0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
375f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f  (pPager->jfd, iO
37600 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ff+pPager->pageS
37610 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20  ize+4, cksum);. 
37620 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37630 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37640 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55  .  IOTRACE(("JOU
37650 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c  T %p %d %lld %d\
37660 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
37670 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
37680 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
37690 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70  alOff, pPager->p
376a0 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 50 41 47  ageSize));.  PAG
376b0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
376c0 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
376d0 6e 74 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  nt);.  PAGERTRAC
376e0 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E(("JOURNAL %d p
376f0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
37700 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
37710 2c 0a 20 20 20 20 20 20 20 50 41 47 45 52 49 44  ,.       PAGERID
37720 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
37730 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 28 28 70  gno, .       ((p
37740 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
37750 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c  NEED_SYNC)?1:0),
37760 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
37770 70 50 67 29 29 29 3b 0a 0a 20 20 70 50 61 67 65  pPg)));..  pPage
37780 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
37790 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67   8 + pPager->pag
377a0 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  eSize;.  pPager-
377b0 3e 6e 52 65 63 2b 2b 3b 0a 20 20 61 73 73 65 72  >nRec++;.  asser
377c0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
377d0 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 72 63  urnal!=0 );.  rc
377e0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
377f0 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
37800 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
37810 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o);.  testcase( 
37820 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
37830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63   );.  assert( rc
37840 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
37850 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
37860 29 3b 0a 20 20 72 63 20 7c 3d 20 61 64 64 54 6f  );.  rc |= addTo
37870 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
37880 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
37890 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  no);.  assert( r
378a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
378b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
378c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
378d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
378e0 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67   single data pag
378f0 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
37900 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  The page is writ
37910 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
37920 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72   main journal or
37930 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20   sub-journal as 
37940 72 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65  required. If the
37950 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
37960 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20   into.** one of 
37970 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  the journals, th
37980 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
37990 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68  bit is set in th
379a0 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  e .** Pager.pInJ
379b0 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e  ournal bitvec an
379c0 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
379d0 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
379e0 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20  t bitvecs.** of 
379f0 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  any open savepoi
37a00 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61  nts as appropria
37a10 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
37a20 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
37a30 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
37a40 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
37a50 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
37a60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37a70 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
37a80 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ne is not called
37a90 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d   unless a write-
37aa0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
37ab0 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65  already .  ** be
37ac0 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65 20  en started. The 
37ad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
37ae0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
37af0 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e  pen at this poin
37b00 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65  t..  ** It is ne
37b10 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68  ver called in th
37b20 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20  e ERROR state.. 
37b30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
37b40 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37b50 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
37b60 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
37b70 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37b80 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
37b90 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
37ba0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37bb0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
37bc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
37bd0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
37be0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
37bf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
37c00 72 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 61 73  rCode==0 );.  as
37c10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65  sert( pPager->re
37c20 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 43  adOnly==0 );.  C
37c30 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
37c40 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61  .  /* The journa
37c50 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
37c60 62 65 20 6f 70 65 6e 65 64 2e 20 48 69 67 68 65  be opened. Highe
37c70 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73  r level routines
37c80 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
37c90 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20  ** obtained the 
37ca0 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20  necessary locks 
37cb0 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72 69  to begin the wri
37cc0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
37cd0 62 75 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c  but the.  ** rol
37ce0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69  lback journal mi
37cf0 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f  ght not yet be o
37d00 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77  pen. Open it now
37d10 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
37d20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
37d30 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66  This is done bef
37d40 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  ore calling sqli
37d50 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
37d60 74 79 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65  ty() on the page
37d70 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  . .  ** Otherwis
37d80 65 2c 20 69 66 20 69 74 20 77 65 72 65 20 64 6f  e, if it were do
37d90 6e 65 20 61 66 74 65 72 20 63 61 6c 6c 69 6e 67  ne after calling
37da0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
37db0 6b 65 44 69 72 74 79 28 29 2c 20 74 68 65 6e 0a  keDirty(), then.
37dc0 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69    ** an error mi
37dd0 67 68 74 20 6f 63 63 75 72 20 61 6e 64 20 74 68  ght occur and th
37de0 65 20 70 61 67 65 72 20 77 6f 75 6c 64 20 65 6e  e pager would en
37df0 64 20 75 70 20 69 6e 20 57 52 49 54 45 52 5f 4c  d up in WRITER_L
37e00 4f 43 4b 45 44 20 73 74 61 74 65 0a 20 20 2a 2a  OCKED state.  **
37e10 20 77 69 74 68 20 70 61 67 65 73 20 6d 61 72 6b   with pages mark
37e20 65 64 20 61 73 20 64 69 72 74 79 20 69 6e 20 74  ed as dirty in t
37e30 68 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  he cache..  */. 
37e40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
37e50 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37e60 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  R_LOCKED ){.    
37e70 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
37e80 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
37e90 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
37ea0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
37eb0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
37ec0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37ed0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
37ee0 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73  ACHEMOD );.  ass
37ef0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
37f00 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
37f10 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68  );..  /* Mark th
37f20 65 20 70 61 67 65 20 74 68 61 74 20 69 73 20 61  e page that is a
37f30 62 6f 75 74 20 74 6f 20 62 65 20 6d 6f 64 69 66  bout to be modif
37f40 69 65 64 20 61 73 20 64 69 72 74 79 2e 20 2a 2f  ied as dirty. */
37f50 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
37f60 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
37f70 0a 20 20 2f 2a 20 49 66 20 61 20 72 6f 6c 6c 62  .  /* If a rollb
37f80 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 69 73 20 69  ack journal is i
37f90 6e 20 75 73 65 2c 20 74 68 65 6d 20 6d 61 6b 65  n use, them make
37fa0 20 73 75 72 65 20 74 68 65 20 70 61 67 65 20 74   sure the page t
37fb0 68 61 74 20 69 73 20 61 62 6f 75 74 0a 20 20 2a  hat is about.  *
37fc0 2a 20 74 6f 20 63 68 61 6e 67 65 20 69 73 20 69  * to change is i
37fd0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
37fe0 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 74 68  ournal, or if th
37ff0 65 20 70 61 67 65 20 69 73 20 61 20 6e 65 77 20  e page is a new 
38000 70 61 67 65 20 6f 66 66 0a 20 20 2a 2a 20 74 68  page off.  ** th
38010 65 6e 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  en end of the fi
38020 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74  le, make sure it
38030 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 50 47   is marked as PG
38040 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 2e 0a 20  HDR_NEED_SYNC.. 
38050 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
38060 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
38070 6c 21 3d 30 29 20 3d 3d 20 69 73 4f 70 65 6e 28  l!=0) == isOpen(
38080 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
38090 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
380a0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 0a 20 20 20 26  nJournal!=0.   &
380b0 26 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  & sqlite3BitvecT
380c0 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  estNotNull(pPage
380d0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
380e0 50 67 2d 3e 70 67 6e 6f 29 3d 3d 30 0a 20 20 29  Pg->pgno)==0.  )
380f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  {.    assert( pa
38100 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
38110 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
38120 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
38130 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
38140 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
38150 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61  rAddPageToRollba
38160 63 6b 4a 6f 75 72 6e 61 6c 28 70 50 67 29 3b 0a  ckJournal(pPg);.
38170 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
38180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
38190 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
381a0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
381b0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
381c0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
381d0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b  _WRITER_DBMOD ){
381e0 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c  .        pPg->fl
381f0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
38200 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a  D_SYNC;.      }.
38210 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
38220 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  (("APPEND %d pag
38230 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
38240 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
38250 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
38260 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20  r), pPg->pgno,. 
38270 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
38280 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
38290 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29  EED_SYNC)?1:0)))
382a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
382b0 2a 20 54 68 65 20 50 47 48 44 52 5f 44 49 52 54  * The PGHDR_DIRT
382c0 59 20 62 69 74 20 69 73 20 73 65 74 20 61 62 6f  Y bit is set abo
382d0 76 65 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ve when the page
382e0 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 74 68   was added to th
382f0 65 20 64 69 72 74 79 2d 6c 69 73 74 0a 20 20 2a  e dirty-list.  *
38300 2a 20 61 6e 64 20 62 65 66 6f 72 65 20 77 72 69  * and before wri
38310 74 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e  ting the page in
38320 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  to the rollback 
38330 6a 6f 75 72 6e 61 6c 2e 20 20 57 61 69 74 20 75  journal.  Wait u
38340 6e 74 69 6c 20 6e 6f 77 2c 0a 20 20 2a 2a 20 61  ntil now,.  ** a
38350 66 74 65 72 20 74 68 65 20 70 61 67 65 20 68 61  fter the page ha
38360 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
38370 6c 6c 79 20 6a 6f 75 72 6e 61 6c 6c 65 64 2c 20  lly journalled, 
38380 62 65 66 6f 72 65 20 73 65 74 74 69 6e 67 20 74  before setting t
38390 68 65 0a 20 20 2a 2a 20 50 47 48 44 52 5f 57 52  he.  ** PGHDR_WR
383a0 49 54 45 41 42 4c 45 20 62 69 74 20 74 68 61 74  ITEABLE bit that
383b0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
383c0 74 68 65 20 70 61 67 65 20 63 61 6e 20 62 65 20  the page can be 
383d0 73 61 66 65 6c 79 20 6d 6f 64 69 66 69 65 64 2e  safely modified.
383e0 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61  .  */.  pPg->fla
383f0 67 73 20 7c 3d 20 50 47 48 44 52 5f 57 52 49 54  gs |= PGHDR_WRIT
38400 45 41 42 4c 45 3b 0a 20 20 0a 20 20 2f 2a 20 49  EABLE;.  .  /* I
38410 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
38420 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
38430 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
38440 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20  not in it,.  ** 
38450 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70  then write the p
38460 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73 74 61  age into the sta
38470 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
38480 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
38490 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20  r->nSavepoint>0 
384a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a  ){.    rc = subj
384b0 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75  ournalPageIfRequ
384c0 69 72 65 64 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  ired(pPg);.  }..
384d0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
384e0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
384f0 64 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 69  d return. */.  i
38500 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
38510 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
38520 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
38530 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
38540 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
38550 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
38560 20 61 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71   a variant of sq
38570 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
38580 29 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  ) that runs when
38590 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
385a0 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68  .** is larger th
385b0 61 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  an the page size
385c0 2e 20 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20  .  SQLite makes 
385d0 74 68 65 20 28 72 65 61 73 6f 6e 61 62 6c 65 29  the (reasonable)
385e0 20 61 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74   assumption that
385f0 0a 2a 2a 20 61 6c 6c 20 62 79 74 65 73 20 6f 66  .** all bytes of
38600 20 61 20 73 65 63 74 6f 72 20 61 72 65 20 77 72   a sector are wr
38610 69 74 74 65 6e 20 74 6f 67 65 74 68 65 72 20 62  itten together b
38620 79 20 68 61 72 64 77 61 72 65 2e 20 20 48 65 6e  y hardware.  Hen
38630 63 65 2c 20 61 6c 6c 20 62 79 74 65 73 20 6f 66  ce, all bytes of
38640 0a 2a 2a 20 61 20 73 65 63 74 6f 72 20 6e 65 65  .** a sector nee
38650 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 6c  d to be journall
38660 65 64 20 69 6e 20 63 61 73 65 20 6f 66 20 61 20  ed in case of a 
38670 70 6f 77 65 72 20 6c 6f 73 73 20 69 6e 20 74 68  power loss in th
38680 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 61  e middle of.** a
38690 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 55 73   write..**.** Us
386a0 75 61 6c 6c 79 2c 20 74 68 65 20 73 65 63 74 6f  ually, the secto
386b0 72 20 73 69 7a 65 20 69 73 20 6c 65 73 73 20 74  r size is less t
386c0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
386d0 74 68 65 20 70 61 67 65 20 73 69 7a 65 2c 20 69  the page size, i
386e0 6e 20 77 68 69 63 68 0a 2a 2a 20 63 61 73 65 20  n which.** case 
386f0 70 61 67 65 73 20 63 61 6e 20