/ Hex Artifact Content
Login

Artifact 2a9d77ac483a684c4187ec9ca786b551d3adfda5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76 65      0x01 /* Neve
52b0: 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20 20  r spill cache.  
52c0: 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20 2a  Set via pragma *
52d0: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
52e0: 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 20  LAG_ROLLBACK    
52f0: 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74 20  0x02 /* Current 
5300: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73 6f  rolling back, so
5310: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a 2f   do not spill */
5320: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
5330: 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20 30  AG_NOSYNC      0
5340: 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20  x04 /* Spill is 
5350: 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73  ok, but do not s
5360: 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ync */../*.** An
5370: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5380: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5390: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
53a0: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
53b0: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
53c0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
53d0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
53e0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
53f0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
5400: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
5410: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
5420: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5430: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5440: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5450: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5460: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5470: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5480: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5490: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
54a0: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
54b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
54c0: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
54d0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
54e0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
54f0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
5500: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
5510: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
5520: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5530: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5540: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5550: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5560: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5570: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5580: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5590: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
55a0: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
55b0: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
55c0: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
55d0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
55e0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
55f0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
5600: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
5610: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
5620: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5630: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5640: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5650: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5660: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5670: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5680: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5690: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
56a0: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
56b0: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
56c0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
56d0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
56e0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
56f0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
5700: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
5710: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
5720: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5730: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5740: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5750: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5760: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5770: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5780: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5790: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
57a0: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
57b0: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
57c0: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
57d0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
57e0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
57f0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
5800: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5810: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
5820: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5830: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5840: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5850: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5860: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5870: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5880: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5890: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
58a0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
58b0: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
58c0: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
58d0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
58e0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
58f0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
5900: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
5910: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
5920: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5930: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5940: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5950: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5960: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5970: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5980: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5990: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
59a0: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
59b0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
59c0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
59d0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
59e0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
59f0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
5a00: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
5a10: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
5a20: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5a30: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5a40: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5a50: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5a60: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5a70: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5a80: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5a90: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5aa0: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5ab0: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5ac0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
5ad0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
5ae0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
5af0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
5b00: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
5b10: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
5b20: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5b30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5b40: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b50: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5b60: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5b70: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5b80: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5b90: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5ba0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5bb0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5bc0: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5bd0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5be0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5bf0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5c00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5c10: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5c20: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5c30: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5c40: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5c50: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c60: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5c70: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5c80: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5c90: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5ca0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5cb0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5cc0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5cd0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5ce0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5cf0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5d00: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5d10: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5d20: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5d30: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5d40: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5d50: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5d60: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5d70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5d80: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5d90: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5da0: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5db0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5dc0: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5dd0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5de0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5df0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5e00: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5e10: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5e20: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5e30: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5e40: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5e50: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5e60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5e70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5e80: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5e90: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5ea0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5eb0: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5ec0: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5ed0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5ee0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5ef0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5f00: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5f20: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5f30: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5f40: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5f50: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5f60: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5f70: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5f80: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5f90: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5fa0: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ill.**.**   This
5fb0: 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72   variables contr
5fc0: 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ol the behavior 
5fd0: 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20  of cache-spills 
5fe0: 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a   (calls made by.
5ff0: 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20  **   the pcache 
6000: 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61  module to the pa
6010: 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74  gerStress() rout
6020: 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63  ine to write cac
6030: 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f  hed data.**   to
6040: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
6050: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65   in order to fre
6060: 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a  e up memory)..**
6070: 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20  .**   When bits 
6080: 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72  SPILLFLAG_OFF or
6090: 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
60a0: 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c  ACK of doNotSpil
60b0: 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20  l are set,.**   
60c0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
60d0: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
60e0: 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69  erStress() is di
60f0: 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65  sabled altogethe
6100: 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c  r..**   The SPIL
6110: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63  LFLAG_ROLLBACK c
6120: 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61  ase is done in a
6130: 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61   very obscure ca
6140: 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d  se that.**   com
6150: 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76  es up during sav
6160: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
6170: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
6180: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a  e pcache module.
6190: 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65  **   to allocate
61a0: 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70   a new page to p
61b0: 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e  revent the journ
61c0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
61d0: 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20  ng written.**   
61e0: 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e  while it is bein
61f0: 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63  g traversed by c
6200: 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61  ode in pager_pla
6210: 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50  yback().  The SP
6220: 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20  ILLFLAG_OFF.**  
6230: 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20   case is a user 
6240: 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a  preference..** .
6250: 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c  **   If the SPIL
6260: 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74  LFLAG_NOSYNC bit
6270: 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67   is set, writing
6280: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6290: 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65 72   from.**   pager
62a0: 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72 6d  Stress() is perm
62b0: 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69  itted, but synci
62c0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
62d0: 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20 20  ile is not..**  
62e0: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
62f0: 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
6300: 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68  rWrite() when th
6310: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65  e file-system se
6320: 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20 69  ctor-size.**   i
6330: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6340: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d  e database page-
6350: 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  size in order to
6360: 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e   prevent a journ
6370: 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72 6f  al sync.**   fro
6380: 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20 62  m happening in b
6390: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63a0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63b0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63c0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63d0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63e0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
63f0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6400: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6410: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6420: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6430: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6440: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6450: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6460: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6470: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6480: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
6490: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64a0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64b0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64c0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64d0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64e0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
64f0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6500: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6510: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6520: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6530: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6540: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6550: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6560: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6580: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
6590: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65a0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65b0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65c0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65d0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65e0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
65f0: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6600: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6610: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6620: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6630: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6640: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6650: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6660: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6670: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6680: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
6690: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66a0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66b0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66c0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66d0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66e0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
66f0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6700: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6710: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6720: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6730: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6740: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6750: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6760: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6770: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6780: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
6790: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67a0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67b0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67c0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67d0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67e0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
67f0: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6800: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6810: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6820: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6830: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6840: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6850: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6860: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6870: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6880: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
6890: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68a0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68b0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68c0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68d0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68e0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
68f0: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6900: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6910: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6920: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6930: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6940: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6950: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6960: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6970: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6980: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
6990: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69a0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69b0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69c0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69d0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69e0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
69f0: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a00: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a10: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a20: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a30: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a40: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a50: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a60: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a70: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a80: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6a90: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6aa0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ab0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ac0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ad0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6ae0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6af0: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b00: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b20: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b30: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b40: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b50: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b60: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b70: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b80: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6b90: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6ba0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bb0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bc0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6bd0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6be0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6bf0: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c00: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c10: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c20: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c30: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c40: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c50: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c60: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c70: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c80: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6c90: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6ca0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cb0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cc0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6cd0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6ce0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6cf0: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d00: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d10: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d30: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d40: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d50: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d60: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d70: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d80: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6d90: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6da0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6db0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dc0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6dd0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6de0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6df0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e00: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e10: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e20: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e30: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e40: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e50: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e60: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e70: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e80: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6e90: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6ea0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6eb0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ec0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ed0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ee0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6ef0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f00: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f10: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f20: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f30: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f40: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f50: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f60: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f70: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f80: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6f90: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fa0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fb0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fc0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fd0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6fe0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
6ff0: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7000: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7010: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7020: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7030: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7040: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7050: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7060: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7070: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7080: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
7090: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70a0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70b0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70c0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70d0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70e0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
70f0: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7100: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7110: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7120: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7130: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7140: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7150: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7160: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7170: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7180: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
7190: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71a0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71b0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71c0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71d0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71e0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
71f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7200: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7210: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7230: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7240: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7250: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7260: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7270: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7280: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
7290: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72a0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72c0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72e0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
72f0: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7310: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7320: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7330: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7340: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7350: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7360: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7370: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7380: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73a0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73b0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73c0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73d0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
73f0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7400: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7420: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7430: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7440: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7450: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7460: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7480: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
7490: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74a0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74c0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74d0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74e0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7540: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7550: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7560: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7570: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7580: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
7590: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75a0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75b0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75c0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75d0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75e0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
75f0: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7600: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7610: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7620: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7630: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7640: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7650: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7660: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7670: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7680: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
7690: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76a0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76b0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76c0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76d0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76e0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
76f0: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7700: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7710: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7740: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7750: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7760: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
7790: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77a0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77b0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77d0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77e0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
77f0: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7800: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7810: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7820: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7830: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7840: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7850: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7860: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7870: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7880: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
7890: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78b0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78c0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78d0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78e0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
78f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7900: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7910: 0a 20 20 75 38 20 68 61 73 48 65 6c 64 53 68 61  .  u8 hasHeldSha
7920: 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20 20 20 2f  redLock;       /
7930: 2a 20 54 72 75 65 20 69 66 20 61 20 73 68 61 72  * True if a shar
7940: 65 64 20 6c 6f 63 6b 20 68 61 73 20 65 76 65 72  ed lock has ever
7950: 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f 0a 20 20   been held */.  
7960: 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 20  Pgno dbSize;    
7970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7980: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7990: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
79a0: 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67 53  /.  Pgno dbOrigS
79b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
79c0: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
79d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
79e0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67  nsaction */.  Pg
79f0: 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20 20  no dbFileSize;  
7a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7a10: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
7a20: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7a30: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48 69  e */.  Pgno dbHi
7a40: 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ntSize;         
7a50: 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73 73     /* Value pass
7a60: 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a 45  ed to FCNTL_SIZE
7a70: 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20 20  _HINT call */.  
7a80: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
7aa0: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
7ab0: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
7ac0: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ae0: 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c  * Pages journall
7af0: 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d  ed since last j-
7b00: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a  header written *
7b10: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
7b20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
7b30: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
7b40: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
7b50: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
7b60: 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20  .  u32 nSubRec; 
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
7b90: 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  rds written to s
7ba0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
7bb0: 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e  Bitvec *pInJourn
7bc0: 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  al;         /* O
7bd0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
7be0: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
7bf0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73  base file */.  s
7c00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
7c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
7c20: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7c30: 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  r database */.  
7c40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
7c50: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
7c60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7c70: 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  or main journal 
7c80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
7c90: 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20  e *sjfd;        
7ca0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
7cb0: 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72  tor for sub-jour
7cc0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  nal */.  i64 jou
7cd0: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
7ce0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
7cf0: 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20  write offset in 
7d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7d10: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
7d20: 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  lHdr;           
7d30: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
7d40: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75   to previous jou
7d50: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
7d60: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
7d70: 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20  *pBackup;    /* 
7d80: 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20  Pointer to list 
7d90: 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75  of ongoing backu
7da0: 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20  p processes */. 
7db0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
7dc0: 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20  *aSavepoint; /* 
7dd0: 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20  Array of active 
7de0: 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20  savepoints */.  
7df0: 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20  int nSavepoint; 
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7e10: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
7e20: 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b  s in aSavepoint[
7e30: 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61 74 61  ] */.  u32 iData
7e40: 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20  Version;        
7e50: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
7e60: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
7e70: 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65 73 20  content changes 
7e80: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
7e90: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
7ea0: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
7eb0: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
7ec0: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20  le changes */.. 
7ed0: 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20   int nMmapOut;  
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ef0: 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70  Number of mmap p
7f00: 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  ages currently o
7f10: 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20  utstanding */.  
7f20: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
7f30: 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44  Mmap;       /* D
7f40: 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d  esired maximum m
7f50: 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67  map size */.  Pg
7f60: 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69  Hdr *pMmapFreeli
7f70: 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  st;       /* Lis
7f80: 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70  t of free mmap p
7f90: 61 67 65 20 68 65 61 64 65 72 73 20 28 70 44 69  age headers (pDi
7fa0: 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a  rty) */.  /*.  *
7fb0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75  * End of the rou
7fc0: 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20  tinely-changing 
7fd0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20  class members.  
7fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20  ***********/..  
8030: 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20  u16 nExtra;     
8040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8050: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
8060: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
8070: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
8080: 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  16 nReserve;    
8090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
80a0: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
80b0: 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65  ytes at end of e
80c0: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33  ach page */.  u3
80d0: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
80e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
80f0: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
8100: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
8110: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
8120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8130: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
8140: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
8150: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  ck */.  int page
8160: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
8170: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8180: 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65   bytes in a page
8190: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e   */.  Pgno mxPgn
81a0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
81b0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
81c0: 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  owed size of the
81d0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
81e0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
81f0: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
8200: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
8210: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
8220: 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  files */.  char 
8230: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
8240: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
8250: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
8260: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
8270: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
8280: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8290: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
82a0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
82b0: 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29  yHandler)(void*)
82c0: 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ; /* Function to
82d0: 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20   call when busy 
82e0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
82f0: 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20  HandlerArg;     
8300: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75   /* Context argu
8310: 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61  ment for xBusyHa
8320: 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61  ndler */.  int a
8330: 53 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20  Stat[3];        
8340: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
8350: 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73  cache hits, miss
8360: 65 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f  es and writes */
8370: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8380: 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b  EST.  int nRead;
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
83b0: 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64  ges read */.#end
83c0: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
83d0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
83e0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
83f0: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
8400: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69  ding pages */.#i
8410: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
8420: 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a  CODEC.  void *(*
8430: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
8440: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
8450: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
8460: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
8470: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
8480: 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a  cSizeChng)(void*
8490: 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f  ,int,int); /* No
84a0: 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a  tify of page siz
84b0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76  e changes */.  v
84c0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65  oid (*xCodecFree
84d0: 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20  )(void*);       
84e0: 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63        /* Destruc
84f0: 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65  tor for the code
8500: 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  c */.  void *pCo
8510: 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  dec;            
8520: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
8530: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e  ment to xCodec..
8540: 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e  . methods */.#en
8550: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
8560: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
8570: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
8580: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
8590: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
85a0: 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61  /.  PCache *pPCa
85b0: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
85c0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
85d0: 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20  ge cache object 
85e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
85f0: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c  E_OMIT_WAL.  Wal
8600: 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *pWal;         
8610: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
8620: 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64  e-ahead log used
8630: 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   by "journal_mod
8640: 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72  e=wal" */.  char
8650: 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *zWal;         
8660: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
8670: 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61  name for write-a
8680: 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64  head log */.#end
8690: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64  if.};../*.** Ind
86a0: 65 78 65 73 20 66 6f 72 20 75 73 65 20 77 69 74  exes for use wit
86b0: 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e  h Pager.aStat[].
86c0: 20 54 68 65 20 50 61 67 65 72 2e 61 53 74 61 74   The Pager.aStat
86d0: 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
86e0: 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20  s.** the values 
86f0: 61 63 63 65 73 73 65 64 20 62 79 20 70 61 73 73  accessed by pass
8700: 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41  ing SQLITE_DBSTA
8710: 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43  TUS_CACHE_HIT, C
8720: 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72  ACHE_MISS .** or
8730: 20 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20   CACHE_WRITE to 
8740: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
8750: 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  s()..*/.#define 
8760: 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20  PAGER_STAT_HIT  
8770: 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   0.#define PAGER
8780: 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64  _STAT_MISS  1.#d
8790: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
87a0: 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20  _WRITE 2../*.** 
87b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
87c0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68  obal variables h
87d0: 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65  old counters use
87e0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
87f0: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20   purposes only. 
8800: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
8810: 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e   do not exist in
8820: 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e  .** a non-testin
8830: 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20  g build.  These 
8840: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f  variables are no
8850: 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a  t thread-safe..*
8860: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8870: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
8880: 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
8890: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
88a0: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
88b0: 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42  ges read from DB
88c0: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
88d0: 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
88e0: 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  unt = 0;   /* Nu
88f0: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
8900: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42  es written to DB
8910: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
8920: 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
8930: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
8940: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
8950: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
8960: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47   */.# define PAG
8970: 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a  ER_INCR(v)  v++.
8980: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
8990: 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e  AGER_INCR(v).#en
89a0: 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  dif..../*.** Jou
89b0: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
89c0: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
89d0: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
89e0: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
89f0: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
8a00: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
8a10: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
8a20: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
8a30: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65  ..**.** Since ve
8a40: 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65  rsion 2.8.0, the
8a50: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
8a60: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
8a70: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
8a80: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
8a90: 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65  on.  If the powe
8aa0: 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  r fails while th
8ab0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
8ac0: 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73  ng.** written, s
8ad0: 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61  emi-random garba
8ae0: 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70  ge data might ap
8af0: 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  pear in the jour
8b00: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65  nal.** file afte
8b10: 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  r power is resto
8b20: 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65  red.  If an atte
8b30: 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65  mpt is then made
8b40: 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20  .** to roll the 
8b50: 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68  journal back, th
8b60: 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
8b70: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20   be corrupted.  
8b80: 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  The additional.*
8b90: 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * sanity checkin
8ba0: 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74  g data is an att
8bb0: 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72  empt to discover
8bc0: 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20   the garbage in 
8bd0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  the.** journal a
8be0: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a  nd ignore it..**
8bf0: 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63  .** The sanity c
8c00: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
8c10: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ion for the new 
8c20: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
8c30: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20  onsists.** of a 
8c40: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
8c50: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20  on each page of 
8c60: 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b  data.  The check
8c70: 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a  sum covers both.
8c80: 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
8c90: 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65  er and the pPage
8ca0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
8cb0: 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68  s of data for th
8cc0: 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
8cd0: 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c  cksum is initial
8ce0: 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74  ized to a 32-bit
8cf0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68   random value th
8d00: 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  at appears in th
8d10: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
8d20: 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  e right after th
8d30: 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72  e header.  The r
8d40: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65  andom initialize
8d50: 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a  r is important,.
8d60: 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61  ** because garba
8d70: 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70  ge data that app
8d80: 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  ears at the end 
8d90: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  of a journal is 
8da0: 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74  likely.** data t
8db0: 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20  hat was once in 
8dc0: 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74  other files that
8dd0: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64   have now been d
8de0: 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a  eleted.  If the.
8df0: 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20  ** garbage data 
8e00: 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73  came from an obs
8e10: 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
8e20: 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  le, the checksum
8e30: 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f  s might.** be co
8e40: 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69  rrect.  But by i
8e50: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
8e60: 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64  checksum to rand
8e70: 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a  om value which.*
8e80: 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  * is different f
8e90: 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c  or every journal
8ea0: 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  , we minimize th
8eb0: 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  at risk..*/.stat
8ec0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
8ed0: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
8ee0: 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  agic[] = {.  0xd
8ef0: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
8f00: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
8f10: 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a   0x63, 0xd7,.};.
8f20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
8f30: 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70  of the of each p
8f40: 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68  age record in th
8f50: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76  e journal is giv
8f60: 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c  en by.** the fol
8f70: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f  lowing macro..*/
8f80: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
8f90: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20  _PG_SZ(pPager)  
8fa0: 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ((pPager->pageSi
8fb0: 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20  ze) + 8)../*.** 
8fc0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
8fd0: 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  er size for this
8fe0: 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20   pager. This is 
8ff0: 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65  usually the same
9000: 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73   .** size as a s
9010: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
9020: 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53  r. See also setS
9030: 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a  ectorSize()..*/.
9040: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
9050: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28  HDR_SZ(pPager) (
9060: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
9070: 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  ze)../*.** The m
9080: 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72  acro MEMDB is tr
9090: 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61  ue if we are dea
90a0: 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d  ling with an in-
90b0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
90c0: 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61  .** We do this a
90d0: 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61  s a macro so tha
90e0: 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  t if the SQLITE_
90f0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61  OMIT_MEMORYDB ma
9100: 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74  cro is set,.** t
9110: 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44  he value of MEMD
9120: 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73  B will be a cons
9130: 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d  tant and the com
9140: 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d  piler will optim
9150: 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20  ize.** out code 
9160: 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72  that would never
9170: 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66   execute..*/.#if
9180: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9190: 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e  MEMORYDB.# defin
91a0: 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a  e MEMDB 0.#else.
91b0: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70  # define MEMDB p
91c0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e  Pager->memDb.#en
91d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  dif../*.** The m
91e0: 61 63 72 6f 20 55 53 45 46 45 54 43 48 20 69 73  acro USEFETCH is
91f0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
9200: 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74  allowed to use t
9210: 68 65 20 78 46 65 74 63 68 20 61 6e 64 20 78 55  he xFetch and xU
9220: 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66  nfetch.** interf
9230: 61 63 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  aces to access t
9240: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  he database usin
9250: 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20  g memory-mapped 
9260: 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  I/O..*/.#if SQLI
9270: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
9280: 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46  >0.# define USEF
9290: 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62 55  ETCH(x) ((x)->bU
92a0: 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a 23  seFetch).#else.#
92b0: 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48   define USEFETCH
92c0: 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 0.#endif../*
92d0: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
92e0: 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
92f0: 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e  r is (2^31 - 1).
9300: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
9310: 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34  R_MAX_PGNO 21474
9320: 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  83647../*.** The
9330: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
9340: 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c  s macro is a fil
9350: 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79  e descriptor (ty
9360: 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  pe sqlite3_file*
9370: 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  )..** Return 0 i
9380: 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  f it is not open
9390: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62  , or non-zero (b
93a0: 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20  ut not 1) if it 
93b0: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  is..**.** This i
93c0: 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73  s so that expres
93d0: 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69  sions can be wri
93e0: 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  tten as:.**.**  
93f0: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
9400: 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a  er->jfd) ){ ....
9410: 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  **.** instead of
9420: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61  .**.**   if( pPa
9430: 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f  ger->jfd->pMetho
9440: 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65  ds ){ ....*/.#de
9450: 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29  fine isOpen(pFd)
9460: 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64   ((pFd)->pMethod
9470: 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s!=0)../*.** Ret
9480: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73  urn true if this
9490: 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72   pager uses a wr
94a0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e  ite-ahead log in
94b0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
94c0: 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  al.** rollback j
94d0: 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73  ournal. Otherwis
94e0: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e  e false..*/.#ifn
94f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9500: 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70  WAL.static int p
9510: 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72  agerUseWal(Pager
9520: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
9530: 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61  urn (pPager->pWa
9540: 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  l!=0);.}.#else.#
9550: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9560: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
9570: 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  e pagerRollbackW
9580: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9590: 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
95a0: 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66  v,w,x,y) 0.# def
95b0: 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  ine pagerOpenWal
95c0: 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c  IfPresent(z) SQL
95d0: 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20  ITE_OK.# define 
95e0: 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
95f0: 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c  ansaction(z) SQL
9600: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23  ITE_OK.#endif..#
9610: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f  ifndef NDEBUG ./
9620: 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a  *.** Usage:.**.*
9630: 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65  *   assert( asse
9640: 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
9650: 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  Pager) );.**.** 
9660: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75  This function ru
9670: 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20  ns many asserts 
9680: 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69  to try to find i
9690: 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69  nconsistencies i
96a0: 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61  n.** the interna
96b0: 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  l state of the P
96c0: 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ager object..*/.
96d0: 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72  static int asser
96e0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
96f0: 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72  ger *p){.  Pager
9700: 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20   *pPager = p;.. 
9710: 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62   /* State must b
9720: 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73  e valid. */.  as
9730: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d  sert( p->eState=
9740: 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20  =PAGER_OPEN.    
9750: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9760: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20  =PAGER_READER.  
9770: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9780: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9790: 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
97a0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97b0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
97c0: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
97d0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
97e0: 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20  TER_DBMOD.      
97f0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9800: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
9810: 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  SHED.       || p
9820: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9830: 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ERROR.  );..  /*
9840: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
9850: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
9860: 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f  , a temp-file co
9870: 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  nnection always 
9880: 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20  behaves.  ** as 
9890: 69 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63  if it has an exc
98a0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
98b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
98c0: 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74  . It never updat
98d0: 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e  es.  ** the chan
98e0: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
98f0: 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43  , so the changeC
9900: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
9910: 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a   always set..  *
9920: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  /.  assert( p->t
9930: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d  empFile==0 || p-
9940: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
9950: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
9960: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9970: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68  =0 || pPager->ch
9980: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b  angeCountDone );
9990: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
99a0: 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73  eJournal flag is
99b0: 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72   clear, the jour
99c0: 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65  nal-mode must be
99d0: 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e   "OFF". .  ** An
99e0: 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d if the journal
99f0: 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20  -mode is "OFF", 
9a00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9a10: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65   must not be ope
9a20: 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
9a30: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9a40: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9a50: 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73  ODE_OFF || p->us
9a60: 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
9a70: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9a80: 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
9a90: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21  NALMODE_OFF || !
9aa0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29  isOpen(p->jfd) )
9ab0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
9ac0: 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73  at MEMDB implies
9ad0: 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20   noSync. And an 
9ae0: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9af0: 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74  l. Since .  ** t
9b00: 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d  his means an in-
9b10: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72  memory pager per
9b20: 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61  forms no IO at a
9b30: 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e  ll, it cannot en
9b40: 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69  counter .  ** ei
9b50: 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
9b60: 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  R or SQLITE_FULL
9b70: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
9b80: 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69   or while finali
9b90: 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75  zing .  ** a jou
9ba0: 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68  rnal file. (alth
9bb0: 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  ough the in-memo
9bc0: 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65  ry journal imple
9bd0: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20  mentation may . 
9be0: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
9bf0: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68  E_IOERR_NOMEM wh
9c00: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
9c10: 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72  file is being wr
9c20: 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a  itten). It .  **
9c30: 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f   is therefore no
9c40: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
9c50: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
9c60: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
9c70: 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65  RROR .  ** state
9c80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d  ..  */.  if( MEM
9c90: 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  DB ){.    assert
9ca0: 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ( p->noSync );. 
9cb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f     assert( p->jo
9cc0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9cd0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9ce0: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d   .         || p-
9cf0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9d00: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9d10: 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20  MEMORY .    );. 
9d20: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53     assert( p->eS
9d30: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
9d40: 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d  R && p->eState!=
9d50: 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
9d60: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
9d70: 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20  seWal(p)==0 );. 
9d80: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e   }..  /* If chan
9d90: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73  geCountDone is s
9da0: 65 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c  et, a RESERVED l
9db0: 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
9dc0: 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a  ust be held.  **
9dd0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   on the file..  
9de0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
9df0: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
9e00: 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Done==0 || pPage
9e10: 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  r->eLock>=RESERV
9e20: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
9e30: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50  ert( p->eLock!=P
9e40: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a  ENDING_LOCK );..
9e50: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74    switch( p->eSt
9e60: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
9e70: 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20  PAGER_OPEN:.    
9e80: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
9e90: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9ea0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9eb0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9ec0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
9ed0: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
9ee0: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
9ef0: 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65  che)==0 || pPage
9f00: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
9f10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9f20: 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44   case PAGER_READ
9f30: 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ER:.      assert
9f40: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9f50: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9f60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9f70: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
9f80: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
9f90: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
9fa0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
9fb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9fc0: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
9fd0: 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20  ER_LOCKED:.     
9fe0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9ff0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a000: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a010: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a020: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a030: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
a040: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
a050: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a060: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52   p->eLock>=RESER
a070: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  VED_LOCK );.    
a080: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
a090: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
a0a0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ==pPager->dbOrig
a0b0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
a0c0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a0d0: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a0e0: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a0f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a100: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a110: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a120: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
a130: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65  sert( pPager->se
a140: 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20  tMaster==0 );.  
a150: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a160: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a170: 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20  R_CACHEMOD:.    
a180: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a190: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
a1a0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a1b0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a1c0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a1d0: 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72        if( !pager
a1e0: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a1f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20  {.        /* It 
a200: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
a210: 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   if journal_mode
a220: 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e  =wal here that n
a230: 65 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20  either the.     
a240: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
a250: 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66  le nor the WAL f
a260: 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68  ile are open. Th
a270: 69 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e  is happens durin
a280: 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72  g.        ** a r
a290: 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74  ollback transact
a2a0: 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65  ion that switche
a2b0: 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d  s from journal_m
a2c0: 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20  ode=off.        
a2d0: 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ** to journal_mo
a2e0: 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20  de=wal..        
a2f0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
a300: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
a310: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
a320: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a330: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a340: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a350: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a360: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a370: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a380: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a390: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a3a0: 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
a3b0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
a3c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a3d0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a3e0: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a3f0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a400: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a410: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a420: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a440: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
a450: 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20  ER_DBMOD:.      
a460: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a470: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a480: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a490: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a4a0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a4b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
a4c0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a4d0: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
a4e0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58  rt( p->eLock>=EX
a4f0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a510: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a520: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a530: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a540: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a550: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  F .           ||
a560: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a570: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a580: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
a590: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a5a0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a5b0: 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e<=pPager->dbHin
a5c0: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a5d0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a5e0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
a5f0: 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73  ISHED:.      ass
a600: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  ert( p->eLock==E
a610: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
a620: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a630: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a640: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a650: 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
a660: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a670: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a680: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a690: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a6a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a6b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a6c0: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
a6d0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a6e0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a6f0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a700: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a710: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a720: 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a  _ERROR:.      /*
a730: 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
a740: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
a750: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
a760: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69  e to the pager i
a770: 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52  f.      ** in ER
a780: 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
a790: 77 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73  wise the pager s
a7a0: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
a7b0: 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20  dy dropped.     
a7c0: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e   ** back to OPEN
a7d0: 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
a7e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a7f0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
a800: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a810: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
a820: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
a830: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
a840: 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  )>0 );.      bre
a850: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
a860: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
a870: 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a   ifndef NDEBUG *
a880: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a890: 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65  _DEBUG ./*.** Re
a8a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a8b0: 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62  o a human readab
a8c0: 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73  le string in a s
a8d0: 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20  tatic buffer.** 
a8e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
a8f0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
a900: 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
a910: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
a920: 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e  This.** is inten
a930: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77  ded to be used w
a940: 69 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e  ithin debuggers.
a950: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
a960: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   an alternative.
a970: 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50  ** to "print *pP
a980: 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a  ager" in gdb:.**
a990: 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66  .** (gdb) printf
a9a0: 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67   "%s", print_pag
a9b0: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
a9c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
a9d0: 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61  *print_pager_sta
a9e0: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
a9f0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74  static char zRet
aa00: 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74  [1024];..  sqlit
aa10: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34  e3_snprintf(1024
aa20: 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46  , zRet,.      "F
aa30: 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73  ilename:      %s
aa40: 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65  \n".      "State
aa50: 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72  :         %s err
aa60: 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Code=%d\n".     
aa70: 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20   "Lock:         
aa80: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f   %s\n".      "Lo
aa90: 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63  cking mode:  loc
aaa0: 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  king_mode=%s\n".
aab0: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d        "Journal m
aac0: 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ode:  journal_mo
aad0: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
aae0: 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74  Backing store: t
aaf0: 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62  empFile=%d memDb
ab00: 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25  =%d useJournal=%
ab10: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  d\n".      "Jour
ab20: 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e  nal:       journ
ab30: 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e  alOff=%lld journ
ab40: 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20  alHdr=%lld\n".  
ab50: 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20      "Size:      
ab60: 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62      dbsize=%d db
ab70: 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69  OrigSize=%d dbFi
ab80: 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20  leSize=%d\n".   
ab90: 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d     , p->zFilenam
aba0: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74  e.      , p->eSt
abb0: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
abc0: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50             ? "OP
abd0: 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  EN" :.        p-
abe0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
abf0: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f  EADER          ?
ac00: 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20   "READER" :.    
ac10: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
ac20: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
ac30: 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c  ED   ? "WRITER_L
ac40: 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20  OCKED" :.       
ac50: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
ac60: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
ac70: 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48  D ? "WRITER_CACH
ac80: 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  EMOD" :.        
ac90: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
aca0: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
acb0: 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44   ? "WRITER_DBMOD
acc0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
acd0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ace0: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22  TER_FINISHED ? "
acf0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22  WRITER_FINISHED"
ad00: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ad10: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
ad20: 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45  R           ? "E
ad30: 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f  RROR" : "?error?
ad40: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
ad50: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
ad60: 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  , p->eLock==NO_L
ad70: 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e  OCK         ? "N
ad80: 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20  O_LOCK" :.      
ad90: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
ada0: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
adb0: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
adc0: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
add0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
ade0: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
adf0: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
ae00: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
ae10: 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20   "SHARED" :.    
ae20: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e      p->eLock==UN
ae30: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20  KNOWN_LOCK    ? 
ae40: 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72  "UNKNOWN" : "?er
ae50: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
ae60: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
ae70: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
ae80: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
ae90: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aea0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aeb0: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
aec0: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
aed0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aee0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aef0: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
af00: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
af10: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
af20: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
af30: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
af40: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
af50: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
af60: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
af70: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
af80: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
af90: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
afa0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
afb0: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
afc0: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
afd0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
afe0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aff0: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
b000: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
b010: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
b020: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
b030: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
b040: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
b050: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66   , p->journalOff
b060: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  , p->journalHdr.
b070: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
b080: 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  dbSize, (int)p->
b090: 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74  dbOrigSize, (int
b0a0: 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  )p->dbFileSize. 
b0b0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52   );..  return zR
b0c0: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  et;.}.#endif../*
b0d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b0e0: 69 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  if it is necessa
b0f0: 72 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65  ry to write page
b100: 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73   *pPg into the s
b110: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41  ub-journal..** A
b120: 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
b130: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
b140: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
b150: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
b160: 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70  ne.** or more op
b170: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f  en savepoints fo
b180: 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20  r which:.**.**  
b190: 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62   * The page-numb
b1a0: 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
b1b0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65  or equal to Page
b1c0: 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67  rSavepoint.nOrig
b1d0: 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
b1e0: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
b1f0: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e  ng to the page-n
b200: 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74  umber is not set
b210: 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72   in.**     Pager
b220: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
b230: 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  epoint..*/.stati
b240: 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72  c int subjRequir
b250: 65 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  esPage(PgHdr *pP
b260: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
b270: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
b280: 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f  r;.  PagerSavepo
b290: 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70  int *p;.  Pgno p
b2a0: 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
b2b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
b2c0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
b2d0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
b2e0: 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67 65 72  .    p = &pPager
b2f0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
b300: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
b310: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
b320: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 4e  lite3BitvecTestN
b330: 6f 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76  otNull(p->pInSav
b340: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
b350: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b360: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b370: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn 0;.}..#ifdef
b380: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
b390: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b3a0: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  if the page is a
b3b0: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
b3c0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73  urnal file..*/.s
b3d0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e  tatic int pageIn
b3e0: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
b3f0: 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
b400: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
b410: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
b420: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
b430: 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d  l, pPg->pgno);.}
b440: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b450: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
b460: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
b470: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b480: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
b490: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
b4a0: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
b4b0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b4c0: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
b4d0: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
b4e0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
b4f0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b500: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
b510: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
b520: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
b530: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
b540: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
b550: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b560: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b570: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
b580: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
b590: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
b5a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
b5b0: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
b5c0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
b5d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b5e0: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
b5f0: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
b600: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b610: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
b620: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
b630: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
b640: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
b650: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
b660: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
b670: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
b680: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
b690: 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57  *)A,B).../*.** W
b6a0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
b6b0: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
b6c0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
b6d0: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
b6e0: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
b6f0: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
b700: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b710: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
b730: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
b740: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
b750: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
b760: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
b770: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
b780: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
b790: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
b7a0: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
b7b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
b7c0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b7d0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b7e0: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b7f0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
b800: 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  .** or SHARED_LO
b810: 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  CK. Regardless o
b820: 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
b830: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e   the call to xUn
b840: 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65  lock().** succee
b850: 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ds, set the Page
b860: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
b870: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61   to match the (a
b880: 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f  ttempted) new lo
b890: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  ck..**.** Except
b8a0: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b8b0: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b8c0: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b8d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
b8e0: 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20   called, do not 
b8f0: 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74  modify it. See t
b900: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
b910: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
b920: 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  .** UNKNOWN_LOCK
b930: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b940: 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  ion of this..*/.
b950: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b960: 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  UnlockDb(Pager *
b970: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
b980: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
b990: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
b9a0: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78  ert( !pPager->ex
b9b0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
b9c0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c  Pager->eLock==eL
b9d0: 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ock );.  assert(
b9e0: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
b9f0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
ba00: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
ba10: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
ba20: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
ba30: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
ba40: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
ba50: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
ba60: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
ba70: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
ba80: 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
ba90: 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f  noLock ? SQLITE_
baa0: 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e  OK : sqlite3OsUn
bab0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
bac0: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
bad0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d   pPager->eLock!=
bae0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
baf0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
bb00: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
bb10: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
bb20: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25  CE(("UNLOCK %p %
bb30: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
bb40: 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75  ock)).  }.  retu
bb50: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bb60: 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  Lock the databas
bb70: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
bb80: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
bb90: 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52  t be either SHAR
bba0: 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45  ED_LOCK,.** RESE
bbb0: 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43  RVED_LOCK or EXC
bbc0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20  LUSIVE_LOCK. If 
bbd0: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75  the caller is su
bbe0: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
bbf0: 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b  e.** Pager.eLock
bc00: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
bc10: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bc20: 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  te. .**.** Excep
bc30: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
bc40: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
bc50: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
bc60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a  is function is .
bc70: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bc80: 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65  t modify it unle
bc90: 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  ss the new locki
bca0: 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c  ng state is EXCL
bcb0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20  USIVE_LOCK. .** 
bcc0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
bcd0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
bce0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
bcf0: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
bd00: 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73  tion .** of this
bd10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bd20: 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65  pagerLockDb(Page
bd30: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
bd40: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
bd50: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
bd60: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53  assert( eLock==S
bd70: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  HARED_LOCK || eL
bd80: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
bd90: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43  CK || eLock==EXC
bda0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
bdb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
bdc0: 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67  ck<eLock || pPag
bdd0: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
bde0: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  WN_LOCK ){.    r
bdf0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
be00: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
be10: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
be20: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
be30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
be40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
be50: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
be60: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
be70: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
be80: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
be90: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bea0: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
beb0: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
bec0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
bed0: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
bee0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bef0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bf00: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
bf10: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bf20: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
bf30: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
bf40: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bf50: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
bf60: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bf70: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bf80: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bf90: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bfa0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bfb0: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bfc0: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bfd0: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bfe0: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bff0: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
c000: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
c010: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
c020: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
c030: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
c040: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
c050: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
c060: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
c070: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
c080: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
c090: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
c0a0: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
c0b0: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
c0c0: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
c0d0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
c0e0: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
c0f0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
c100: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c110: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
c120: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
c130: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c140: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
c150: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
c160: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c170: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
c180: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
c190: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
c1a0: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
c1b0: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
c1c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
c1d0: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
c1e0: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
c1f0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c200: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
c210: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
c220: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
c230: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
c260: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
c270: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
c280: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
c290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c2a0: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c2b0: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c2e0: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c2f0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c300: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c310: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c320: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c330: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c340: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c350: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c360: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c370: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c380: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c390: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c3a0: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c3b0: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c3c0: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c3d0: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c3e0: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c3f0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c400: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c410: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c420: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c430: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c440: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c450: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c460: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c470: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c480: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c490: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c4a0: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c4b0: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c4c0: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c4d0: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c4e0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c4f0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c500: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c510: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c520: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c530: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c540: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c550: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c560: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c570: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c580: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c590: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c5a0: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c5b0: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c5c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c5d0: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c5e0: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c5f0: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c600: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c610: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c620: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c630: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c640: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c650: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c660: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c670: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c680: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c690: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c6a0: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c6b0: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c6c0: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c6d0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c6e0: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c6f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c700: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c710: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c720: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c730: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c740: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c750: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c760: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c770: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c780: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c790: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c7a0: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c7b0: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c7c0: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c7d0: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c7e0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c7f0: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c800: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c810: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c820: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c830: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c840: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c850: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c860: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c870: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c880: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c890: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c8a0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c8b0: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c8c0: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c8d0: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c8e0: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c8f0: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c900: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c910: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c920: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c930: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c940: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c950: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c960: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c970: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c980: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c990: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c9a0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c9b0: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c9c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c9d0: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c9e0: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c9f0: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
ca00: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
ca10: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
ca20: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
ca30: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
ca40: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
ca50: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
ca60: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
ca70: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
ca80: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
ca90: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
caa0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
cab0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
cac0: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
cad0: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
cae0: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
caf0: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
cb00: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
cb10: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
cb20: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
cb30: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
cb40: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
cb50: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
cb60: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
cb70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cb80: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
cb90: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
cba0: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
cbb0: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
cbc0: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
cbd0: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
cbe0: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
cbf0: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
cc00: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
cc10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
cc20: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
cc30: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
cc40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
cc50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cc60: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cc70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cc80: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
cc90: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
cca0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
ccb0: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
ccc0: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
ccd0: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
cce0: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
ccf0: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
cd00: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
cd10: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
cd20: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
cd30: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
cd40: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cd50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cd60: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cd70: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
cd80: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
cd90: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
cda0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
cdb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
cdc0: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
cdd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cde0: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cdf0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
ce00: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
ce10: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
ce20: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
ce30: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
ce40: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
ce50: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
ce60: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
ce70: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ce80: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
ce90: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cea0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
ceb0: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
cec0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
ced0: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cef0: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cf00: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cf10: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cf20: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cf40: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
cf50: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
cf60: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
cf90: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cfa0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cfb0: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cfc0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cfd0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cfe0: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cff0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
d000: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d010: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
d020: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
d030: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
d040: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d050: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d060: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
d070: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
d080: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
d090: 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51  len==0 .   || SQ
d0a0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d0b0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d0c0: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
d0d0: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d0e0: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d0f0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
d100: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
d110: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
d120: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
d130: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
d140: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d150: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d160: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
d170: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
d180: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d190: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
d1a0: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
d1b0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
d1c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d1d0: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
d1e0: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
d1f0: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
d200: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
d210: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
d220: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
d230: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
d240: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
d250: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
d260: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
d270: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
d280: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
d290: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
d2a0: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
d2b0: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
d2c0: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
d2d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d2e0: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
d2f0: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
d300: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
d310: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
d320: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
d330: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
d340: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
d350: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d360: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
d370: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
d380: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
d390: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
d3a0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d3b0: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
d3c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
d3d0: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
d3e0: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
d3f0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
d400: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
d410: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
d420: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
d430: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
d440: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
d450: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
d460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d480: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
d4d0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d4e0: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
d4f0: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
d500: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
d510: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
d520: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
d530: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
d540: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
d550: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
d560: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d570: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
d580: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
d590: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
d5a0: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
d5b0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
d5c0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
d5d0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
d5e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d5f0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
d600: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
d610: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
d620: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
d630: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
d640: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
d650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
d660: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
d670: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
d680: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d690: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d6a0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d6b0: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
d6c0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
d6d0: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
d6e0: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
d6f0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
d700: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
d710: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
d720: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
d730: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
d740: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
d750: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d760: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
d770: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
d780: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
d790: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
d7a0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
d7b0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
d7c0: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
d7d0: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
d7e0: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d7f0: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
d800: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
d810: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
d820: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
d830: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
d840: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
d850: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
d860: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d870: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
d880: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d890: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
d8a0: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
d8b0: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
d8c0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
d8d0: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
d8e0: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
d8f0: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
d900: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
d910: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
d920: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
d930: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
d940: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
d950: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
d960: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
d970: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
d980: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d990: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
d9a0: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
d9b0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
d9c0: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
d9d0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
d9e0: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
d9f0: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
da00: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
da10: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
da20: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
da30: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
da40: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
da50: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
da60: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
da70: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
da80: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
dab0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
dac0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
dad0: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
dae0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
daf0: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
db00: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
db10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
db20: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
db30: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
db40: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
db50: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
db60: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
db70: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
db80: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
db90: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dba0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dbb0: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
dbc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
dbd0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
dbe0: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
dbf0: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
dc00: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
dc10: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
dc20: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
dc30: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
dc40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dc50: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
dc60: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
dc70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
dc80: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
dc90: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
dca0: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
dcb0: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
dcc0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
dcd0: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
dce0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
dcf0: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
dd00: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
dd10: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
dd20: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
dd30: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
dd40: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
dd50: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
dd60: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
dd70: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
dd80: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
dd90: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
dda0: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
ddb0: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
ddc0: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
ddd0: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
dde0: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
ddf0: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
de00: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
de10: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
de20: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
de30: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
de40: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
de50: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
de60: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
de70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
de80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
de90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
dea0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
deb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
dec0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
ded0: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
dee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
def0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
df00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
df10: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
df20: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
df30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
df40: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
df50: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
df60: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
df70: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
df80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
df90: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
dfa0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
dfb0: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
dfc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
dfd0: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
dfe0: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
dff0: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
e000: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
e010: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e020: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
e030: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
e040: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
e050: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
e060: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
e070: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
e080: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
e090: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
e0a0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
e0b0: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
e0c0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
e0d0: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
e0e0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
e0f0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
e100: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
e110: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
e120: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
e130: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
e140: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
e150: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
e160: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
e170: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e180: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
e190: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e1c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
e1d0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
e1e0: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
e1f0: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
e200: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
e210: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
e220: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
e230: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
e240: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
e250: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
e260: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
e270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e290: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
e2a0: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
e2b0: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e2e0: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
e2f0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e300: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
e310: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
e320: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
e330: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
e340: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e350: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
e360: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
e370: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
e380: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e390: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
e3a0: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
e3b0: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
e3c0: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
e3d0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e3e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e3f0: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
e400: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
e410: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
e420: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
e430: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
e440: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
e450: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
e460: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
e470: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e480: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
e490: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e4a0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e4b0: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
e4c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
e4d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
e4e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
e4f0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e500: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
e510: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
e520: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
e530: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
e540: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
e550: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e560: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
e570: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
e580: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
e590: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
e5a0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
e5b0: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
e5c0: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
e5d0: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
e5e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
e5f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
e600: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
e610: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
e620: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
e630: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
e640: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
e650: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
e660: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
e670: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
e680: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
e690: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
e6a0: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
e6b0: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
e6c0: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
e6d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
e6e0: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
e6f0: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
e700: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
e710: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e720: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
e730: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
e740: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
e750: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
e760: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
e770: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
e780: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
e790: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
e7a0: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
e7b0: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
e7c0: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
e7d0: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
e7e0: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
e7f0: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
e800: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
e810: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
e820: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
e830: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
e840: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
e850: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
e860: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
e870: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
e880: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e890: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e8a0: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
e8b0: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
e8c0: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
e8d0: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
e8e0: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
e8f0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e900: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
e910: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e920: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
e930: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
e940: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
e950: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
e960: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
e970: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
e980: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
e990: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
e9a0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
e9b0: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
e9c0: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
e9d0: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
e9e0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
e9f0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
ea00: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ea10: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
ea20: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ea30: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ea40: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
ea50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
ea60: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
ea70: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ea80: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
ea90: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
eaa0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
eab0: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
eac0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
ead0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
eae0: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
eaf0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
eb00: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eb10: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eb20: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
eb30: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
eb40: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
eb50: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
eb60: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
eb70: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
eb80: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
eb90: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
eba0: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
ebb0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
ebc0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
ebd0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
ebe0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ebf0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ec00: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
ec10: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
ec20: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
ec30: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
ec40: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
ec50: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ec60: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
ec70: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
ec80: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
ec90: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
eca0: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
ecb0: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
ecc0: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
ecd0: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
ece0: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
ecf0: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
ed00: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
ed10: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
ed20: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
ed30: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
ed40: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
ed50: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
ed60: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
ed70: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
ed80: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ed90: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
eda0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
edb0: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
edc0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
edd0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
ede0: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
edf0: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
ee00: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
ee10: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
ee20: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
ee30: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
ee40: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
ee50: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
ee60: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
ee70: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
ee80: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
ee90: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
eea0: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
eeb0: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
eec0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
eed0: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
eee0: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
eef0: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
ef00: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
ef10: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
ef20: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
ef30: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
ef40: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
ef50: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
ef60: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
ef70: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
ef80: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
ef90: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
efa0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
efb0: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
efc0: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
efd0: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
efe0: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
eff0: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
f000: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
f010: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
f020: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
f030: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
f040: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
f050: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
f060: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
f070: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
f080: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
f090: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
f0a0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
f0b0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
f0c0: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
f0d0: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
f0e0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
f0f0: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
f100: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
f110: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
f120: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
f130: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
f140: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
f150: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
f160: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
f170: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
f180: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
f190: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
f1a0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
f1b0: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
f1c0: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
f1d0: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
f1e0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
f1f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
f200: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
f210: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f220: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
f230: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
f240: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f250: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
f260: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f270: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
f280: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
f290: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
f2a0: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
f2b0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f2c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
f2d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
f2e0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
f2f0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
f300: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f310: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
f320: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
f330: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
f340: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
f350: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
f360: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
f370: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f380: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f390: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
f3a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f3b0: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
f3c0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
f3d0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
f3e0: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
f3f0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
f400: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
f410: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
f420: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
f430: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
f440: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
f450: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
f460: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
f470: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
f480: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
f490: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
f4a0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
f4b0: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
f4c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
f4d0: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
f4e0: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
f4f0: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
f500: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
f510: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f520: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
f530: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f540: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
f550: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
f560: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f570: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
f580: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
f590: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
f5a0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
f5b0: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
f5c0: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
f5d0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
f5e0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
f5f0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
f600: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f610: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f620: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f630: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
f640: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
f650: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f660: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f670: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
f680: 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
f690: 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
f6a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f6b0: 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
f6c0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
f6d0: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
f6e0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f6f0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f700: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f710: 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
f720: 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f740: 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
f750: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
f760: 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
f770: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f790: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
f7a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f7b0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
f7c0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
f7d0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
f7e0: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
f7f0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
f800: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f810: 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
f820: 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
f830: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
f840: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
f850: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
f860: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
f870: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
f880: 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
f890: 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
f8a0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
f8b0: 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
f8c0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
f8d0: 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
f8e0: 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
f8f0: 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
f900: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
f910: 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
f920: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
f930: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f940: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
f950: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
f960: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
f970: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
f980: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
f990: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
f9a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f9b0: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
f9c0: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
f9d0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
f9e0: 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
f9f0: 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
fa00: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fa10: 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
fa20: 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
fa30: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
fa40: 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
fa50: 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
fa60: 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
fa70: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
fa80: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
fa90: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
faa0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
fab0: 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
fac0: 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
fad0: 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
fae0: 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
faf0: 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
fb00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
fb10: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
fb20: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fb30: 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
fb40: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
fb50: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fb60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
fb70: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
fb80: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
fb90: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
fba0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fbb0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
fbc0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
fbd0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
fbe0: 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
fbf0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fc00: 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
fc10: 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
fc20: 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
fc30: 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
fc40: 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
fc50: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
fc60: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
fc70: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
fc80: 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
fc90: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
fca0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
fcb0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fcc0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fcd0: 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
fce0: 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
fcf0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fd00: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fd10: 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
fd20: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fd30: 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
fd40: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fd50: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fd60: 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
fd70: 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
fd80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fd90: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
fda0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
fdb0: 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
fdc0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fdd0: 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
fde0: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fdf0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
fe00: 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
fe10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
fe20: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
fe30: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
fe40: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
fe50: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
fe60: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
fe70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
fe80: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
fe90: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fea0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
feb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fec0: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
fed0: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
fee0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fef0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ff00: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
ff10: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
ff20: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
ff30: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
ff40: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
ff50: 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
ff60: 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
ff70: 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
ff80: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
ff90: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
ffa0: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
ffb0: 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
ffc0: 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
ffd0: 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
ffe0: 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
fff0: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
10000 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
10010 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
10020 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
10030 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
10040 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
10050 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
10060 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
10070 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
10080 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10090 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
100a0 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
100b0 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
100c0 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
100d0 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
100e0 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
100f0 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
10100 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
10110 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
10120 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
10130 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
10140 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
10150 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
10160 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
10170 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
10180 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
10190 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
101a0 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
101b0 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
101c0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
101d0 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
101e0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
101f0 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
10200 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
10210 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
10220 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
10230 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
10240 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
10250 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
10260 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
10270 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
10280 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
10290 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
102a0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
102b0 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
102c0 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
102d0 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
102e0 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
102f0 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
10300 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
10310 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
10320 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
10330 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10340 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
10350 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10360 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
10370 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10380 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
10390 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
103a0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
103b0 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
103c0 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
103d0 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
103e0 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
103f0 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
10400 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
10410 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
10420 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
10430 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
10440 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
10450 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
10460 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
10470 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10480 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
10490 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
104a0 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
104b0 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
104c0 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
104d0 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
104e0 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
104f0 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
10500 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
10510 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10520 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
10530 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
10540 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
10550 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
10560 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
10570 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
10580 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
10590 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
105a0 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
105b0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
105c0 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
105d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
105e0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
105f0 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
10600 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
10610 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
10620 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10630 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
10640 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
10650 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
10660 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10670 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
10680 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
10690 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
106a0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
106b0 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
106c0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
106d0 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
106e0 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
106f0 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
10700 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
10710 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
10720 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
10730 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
10740 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
10750 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
10760 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
10770 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
10780 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
10790 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
107a0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
107b0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
107c0 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
107d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
107e0 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
107f0 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
10800 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
10810 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10820 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
10830 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
10840 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
10850 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10860 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
10870 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
10880 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
10890 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
108a0 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
108b0 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
108c0 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
108d0 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
108e0 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
108f0 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
10900 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
10910 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
10920 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
10930 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
10940 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
10950 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
10960 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
10970 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
10980 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
10990 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
109a0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
109b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
109c0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
109d0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10a00 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
10a10 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
10a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10a30 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
10a40 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
10a50 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a70 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
10a80 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
10a90 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
10aa0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
10ab0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10ac0 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
10ad0 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
10ae0 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b00 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
10b10 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
10b20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10b30 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
10b40 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
10b50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
10b60 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
10b70 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
10b80 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
10b90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10ba0 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
10bb0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
10bc0 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
10bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10be0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10bf0 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10c00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10c10 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
10c20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10c30 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
10c40 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
10c50 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
10c60 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
10c70 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
10c80 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
10c90 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
10ca0 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
10cb0 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
10cc0 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
10cd0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10ce0 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
10cf0 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
10d00 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
10d10 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
10d20 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
10d30 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
10d40 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
10d50 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
10d60 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
10d70 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10d80 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
10d90 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
10da0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
10db0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10dc0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10dd0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10de0 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10df0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10e00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
10e10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
10e20 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
10e30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10e40 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
10e50 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10e60 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
10e70 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
10e80 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
10e90 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10ea0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10eb0 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
10ec0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
10ed0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10ee0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10ef0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10f00 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
10f10 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
10f20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10f30 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10f40 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10f50 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
10f60 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
10f70 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
10f80 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10f90 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
10fa0 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
10fb0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10fc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10fd0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
10fe0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
10ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11010 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73    iHdrOff+4+nMas
11020 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
11030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11040 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
11050 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
11060 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
11070 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11080 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
11090 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
110a0 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
110b0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
110c0 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
110d0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
110e0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
110f0 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
11100 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
11110 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
11120 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
11130 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
11140 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
11150 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
11160 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
11170 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
11180 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
11190 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
111a0 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
111b0 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
111c0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
111d0 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
111e0 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
111f0 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
11200 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
11210 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
11220 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
11230 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
11240 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
11250 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
11260 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
11270 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
11280 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
11290 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
112a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
112b0 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
112c0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
112d0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
112e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
112f0 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
11300 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
11310 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
11320 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
11330 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
11340 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
11350 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
11360 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
11370 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61  ){.  pPager->iDa
11380 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73  taVersion++;.  s
11390 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
113a0 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
113b0 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
113c0 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
113d0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
113e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
113f0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11400 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75  rsion value.*/.u
11410 33 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  32 sqlite3PagerD
11420 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72  ataVersion(Pager
11430 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
11440 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11450 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29  ate>PAGER_OPEN )
11460 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
11470 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 3b  r->iDataVersion;
11480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11490 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
114a0 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
114b0 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
114c0 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
114d0 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
114e0 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
114f0 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
11500 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
11510 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
11520 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
11530 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11540 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
11550 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11560 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11570 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11580 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11590 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
115a0 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
115b0 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
115c0 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
115d0 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
115e0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
115f0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11600 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
11610 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11620 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
11630 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
11640 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
11650 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
11660 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
11670 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11680 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11690 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
116a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
116b0 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
116c0 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
116d0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
116e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
116f0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11700 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
11710 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
11720 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
11730 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
11740 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
11750 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
11760 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
11770 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
11780 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
11790 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
117a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
117b0 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
117c0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
117d0 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
117e0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
117f0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11800 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
11810 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11820 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11830 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
11840 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
11850 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
11860 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
11870 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11880 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11890 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
118a0 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
118b0 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
118c0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
118d0 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
118e0 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
118f0 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
11900 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
11910 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11920 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11930 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11940 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11950 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
11960 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
11970 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11980 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11990 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
119a0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
119b0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
119c0 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
119d0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
119e0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
119f0 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
11a00 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
11a10 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
11a20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11a30 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11a40 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
11a50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11a60 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
11a70 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
11a80 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
11a90 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
11aa0 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
11ab0 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
11ac0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
11ad0 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
11ae0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11af0 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
11b00 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
11b10 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
11b20 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
11b30 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
11b40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
11b50 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
11b60 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
11b70 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
11b80 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
11b90 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
11ba0 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
11bb0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
11bc0 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
11bd0 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
11be0 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
11bf0 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
11c00 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
11c10 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
11c20 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
11c30 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
11c40 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
11c50 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
11c60 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
11c70 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
11c80 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
11c90 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
11ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11cb0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
11cc0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
11cd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11ce0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
11cf0 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
11d00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11d10 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
11d20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
11d30 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
11d40 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
11d50 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11d60 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11d70 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
11d80 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
11d90 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11da0 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
11db0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
11dc0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
11dd0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
11de0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
11df0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
11e00 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
11e10 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
11e20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
11e30 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
11e40 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
11e50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11e60 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
11e70 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11e90 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
11ea0 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
11eb0 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
11ec0 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
11ed0 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
11ee0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
11ef0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
11f00 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
11f10 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11f20 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
11f30 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
11f40 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
11f50 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
11f60 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
11f70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
11f80 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
11f90 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
11fa0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
11fb0 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
11fc0 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
11fd0 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
11fe0 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
11ff0 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
12000 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12010 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
12020 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
12030 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12040 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12050 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
12060 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12070 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12080 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
12090 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
120a0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
120b0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
120c0 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
120d0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
120e0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
120f0 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
12100 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12110 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
12120 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
12130 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
12140 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
12150 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
12160 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
12170 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
12180 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
12190 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
121a0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
121b0 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
121c0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
121d0 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
121e0 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
121f0 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
12200 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
12210 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
12220 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
12230 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
12240 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
12250 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
12260 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
12270 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
12280 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
12290 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
122a0 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
122b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
122c0 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
122d0 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
122e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
122f0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
12300 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
12310 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
12320 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
12330 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
12340 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
12350 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
12360 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
12370 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
12380 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
12390 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
123a0 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
123b0 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
123c0 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
123d0 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
123e0 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
123f0 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
12400 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
12410 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
12420 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12430 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
12440 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
12450 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
12460 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12470 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
12480 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12490 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
124a0 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
124b0 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
124c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
124d0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
124e0 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
124f0 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
12500 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
12510 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
12520 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
12530 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
12540 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
12550 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
12560 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
12570 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
12580 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
12590 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
125a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
125b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
125c0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
125d0 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
125e0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
125f0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12600 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
12610 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
12620 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12630 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12640 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
12650 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
12660 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43  .    if( USEFETC
12670 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69  H(pPager) ) sqli
12680 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
12690 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
126a0 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
126b0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
126c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
126d0 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Hdr = 0;.  pPage
126e0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
126f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12700 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12710 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49  ed whenever an I
12720 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72  OERR or FULL err
12730 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  or that requires
12740 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
12750 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f   transition into
12760 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12770 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72 72   may ahve occurr
12780 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ed..** The first
12790 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
127a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
127b0 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
127c0 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68  he second .** th
127d0 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
127e0 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
127f0 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
12800 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a   function. The .
12810 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  ** value returne
12820 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
12830 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12840 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
12850 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
12860 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12870 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c  nt is SQLITE_FUL
12880 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  L, SQLITE_IOERR 
12890 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  or one of the.**
128a0 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73   IOERR sub-codes
128b0 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74 65  , the pager ente
128c0 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  rs the ERROR sta
128d0 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  te and the error
128e0 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72   code.** is stor
128f0 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43  ed in Pager.errC
12900 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70  ode. While the p
12910 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20  ager remains in 
12920 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
12930 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50  .** all major AP
12940 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50  I calls on the P
12950 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69  ager will immedi
12960 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67  ately return Pag
12970 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a  er.errCode..**.*
12980 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74  * The ERROR stat
12990 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
129a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
129b0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
129c0 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74   .** cannot be t
129d0 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61  rusted. This sta
129e0 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  te can be cleare
129f0 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d by completely 
12a00 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74  discarding .** t
12a10 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12a20 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20  he pager-cache. 
12a30 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
12a40 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e   was active when
12a50 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65  .** the persiste
12a60 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  nt error occurre
12a70 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
12a80 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
12a90 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
12aa0 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f  eplayed to resto
12ab0 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
12ac0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12ad0 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69  file (as if.** i
12ae0 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75  t were a hot-jou
12af0 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnal)..*/.static
12b00 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
12b10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12b20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
12b30 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
12b40 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
12b50 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44  LITE_OK || !MEMD
12b60 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  B );.  assert(. 
12b70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
12b80 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
12b90 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
12ba0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
12bb0 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
12bc0 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
12bd0 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
12be0 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
12bf0 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
12c00 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c  FULL || rc2==SQL
12c10 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
12c20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12c30 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65   = rc;.    pPage
12c40 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12c50 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  R_ERROR;.  }.  r
12c60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
12c70 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
12c80 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
12c90 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
12ca0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  );../*.** This r
12cb0 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
12cc0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
12cd0 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
12ce0 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
12cf0 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
12d00 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
12d10 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
12d20 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
12d30 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
12d40 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
12d50 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
12d60 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
12d70 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
12d80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12d90 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
12da0 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
12db0 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
12dc0 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
12dd0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
12de0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
12df0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
12e00 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
12e10 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c  e. If it is call
12e20 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e  ed.** in PAGER_N
12e30 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41  ONE or PAGER_SHA
12e40 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74 68  RED state and th
12e50 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c  e lock held is l
12e60 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65  ess.** exclusive
12e70 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45 44   than a RESERVED
12e80 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e   lock, it is a n
12e90 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  o-op..**.** Othe
12ea0 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76  rwise, any activ
12eb0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
12ec0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
12ed0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
12ee0 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
12ef0 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69  en it is "finali
12f00 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75  zed". Once a jou
12f10 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61  rnal .** file ha
12f20 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
12f30 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
12f40 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ble to use it to
12f50 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a   roll back a .**
12f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f   transaction. No
12f70 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e  r will it be con
12f80 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20  sidered to be a 
12f90 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74  hot-journal by t
12fa0 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74  his.** or any ot
12fb0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
12fc0 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79  nection. Exactly
12fd0 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69   how a journal i
12fe0 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64  s finalized.** d
12ff0 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
13000 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67  r or not the pag
13010 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
13020 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
13030 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  and.** the curre
13040 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  nt journal-mode 
13050 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f  (Pager.journalMo
13060 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f  de value), as fo
13070 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a  llows:.**.**   j
13080 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
13090 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  RY.**     Journa
130a0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
130b0 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73  r is simply clos
130c0 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79  ed. This destroy
130d0 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d  s an .**     in-
130e0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
130f0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13100 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a  ode==TRUNCATE.**
13110 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13120 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
13130 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
13140 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  size..**.**   jo
13150 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
13160 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69  ST.**     The fi
13170 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20  rst 28 bytes of 
13180 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13190 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69   are zeroed. Thi
131a0 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a  s invalidates.**
131b0 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a       the first j
131c0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
131d0 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68   the file, and h
131e0 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20  ence the entire 
131f0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
13200 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20  ile. An invalid 
13210 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
13220 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
13230 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ck..**.**   jour
13240 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a  nalMode==DELETE.
13250 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  **     The journ
13260 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  al file is close
13270 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73  d and deleted us
13280 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
13290 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ete()..**.**    
132a0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
132b0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
132c0 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73  usive mode, this
132d0 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c   method of final
132e0 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65  izing.**     the
132f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
13300 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73   never used. Ins
13310 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75  tead, if the jou
13320 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20  rnalMode is.**  
13330 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68     DELETE and th
13340 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
13350 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
13360 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
13370 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20  ed under.**     
13380 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
13390 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73  SIST is used ins
133a0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  tead..**.** Afte
133b0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
133c0 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
133d0 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50  pager moves to P
133e0 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
133f0 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67  e..** If running
13400 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76   in non-exclusiv
13410 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  e rollback mode,
13420 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
13430 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77   file is .** dow
13440 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48 41  ngraded to a SHA
13450 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
13460 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
13470 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
13480 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  r occurs. If an 
13490 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
134a0 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68  ing.** any of th
134b0 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20  e IO operations 
134c0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
134d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
134e0 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61  unlock the.** da
134f0 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20  tabase then the 
13500 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
13510 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
13520 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a   user. If the .*
13530 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66  * operation to f
13540 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
13550 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20  nal file fails, 
13560 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74  then the code st
13570 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20  ill.** tries to 
13580 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
13590 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20  ase file if not 
135a0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
135b0 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c  e. If the.** unl
135c0 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61  ock operation fa
135d0 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65  ils as well, the
135e0 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  n the first erro
135f0 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a  r code related.*
13600 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  * to the first e
13610 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  rror encountered
13620 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69   (the journal fi
13630 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20  nalization one) 
13640 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
13650 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
13660 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
13670 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
13680 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
13690 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
136a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
136b0 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72  E_OK;      /* Er
136c0 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f  ror code from jo
136d0 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
136e0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
136f0 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
13700 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72  TE_OK;     /* Er
13710 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62  ror code from db
13720 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65   file unlock ope
13730 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ration */..  /* 
13740 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68  Do nothing if th
13750 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
13760 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
13770 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite transaction.
13780 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74    ** or at least
13790 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
137a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
137b0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  may be called wh
137c0 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  en there.  ** is
137d0 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
137e0 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74  ction active but
137f0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
13800 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20  reater lock is. 
13810 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74   ** held under t
13820 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
13830 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e  :.  **.  **   1.
13840 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73   After a success
13850 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ful hot-journal 
13860 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
13870 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  called with.  **
13880 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41        eState==PA
13890 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f  GER_NONE and eLo
138a0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
138b0 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  CK..  **.  **   
138c0 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69  2. If a connecti
138d0 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  on with locking_
138e0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68  mode=exclusive h
138f0 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
13900 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c  IVE .  **      l
13910 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63  ock switches bac
13920 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  k to locking_mod
13930 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65  e=normal and the
13940 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a  n executes a.  *
13950 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e  *      read-tran
13960 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75  saction, this fu
13970 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13980 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41   with eState==PA
13990 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a  GER_READER .  **
139a0 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d        and eLock=
139b0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
139c0 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72  when the read-tr
139d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f  ansaction is clo
139e0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  sed..  */.  asse
139f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
13a00 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
13a10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13a20 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
13a30 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28  R_ERROR );.  if(
13a40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
13a50 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
13a60 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65  KED && pPager->e
13a70 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f  Lock<RESERVED_LO
13a80 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
13a90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13aa0 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
13ab0 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
13ac0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
13ad0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
13ae0 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
13af0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
13b00 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13b10 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  jfd) ){.    asse
13b20 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
13b30 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
13b40 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
13b50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
13b60 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
13b70 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
13b80 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
13b90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13ba0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13bb0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13bc0 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
13bd0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
13be0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
13bf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13c00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13c10 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13c20 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
13c30 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
13c40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
13c50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13c60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
13c90 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
13ca0 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  jfd, 0);.       
13cb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13cc0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75  OK && pPager->fu
13cd0 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
13ce0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
13cf0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73 69   the new file si
13d00 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ze is written in
13d10 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69 67  to the inode rig
13d20 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20 20  ht away..       
13d30 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20     ** Otherwise 
13d40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
13d50 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c 6c  t resurrect foll
13d60 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f  owing a power lo
13d70 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ss and.         
13d80 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c 61   ** cause the la
13d90 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  st transaction t
13da0 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65  o roll back.  Se
13db0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  e.          ** h
13dc0 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e  ttps://bugzilla.
13dd0 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77  mozilla.org/show
13de0 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37 32  _bug.cgi?id=1072
13df0 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  773.          */
13e00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
13e10 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
13e20 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
13e30 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
13e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13e50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13e60 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13e70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
13e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13e90 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13ea0 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
13eb0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
13ec0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
13ed0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13ee0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
13ef0 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29  LMODE_WAL).    )
13f00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
13f10 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
13f20 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
13f30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13f40 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
13f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
13f60 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61  * This branch ma
13f70 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69  y be executed wi
13f80 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  th Pager.journal
13f90 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a  Mode==MEMORY if.
13fa0 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a        ** a hot-j
13fb0 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20  ournal was just 
13fc0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20  rolled back. In 
13fd0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
13fe0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66  urnal.      ** f
13ff0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ile should be cl
14000 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
14010 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  . If this connec
14020 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20  tion writes to. 
14030 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
14040 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69  base file, it wi
14050 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61  ll do so using a
14060 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
14070 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  nal. .      */. 
14080 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65       int bDelete
14090 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65 6d   = (!pPager->tem
140a0 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33  pFile && sqlite3
140b0 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70 50  JournalExists(pP
140c0 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20 20  ager->jfd));.   
140d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
140e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
140f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14100 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20  E_DELETE .      
14110 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
14120 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14130 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
14140 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20  EMORY .         
14150 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
14160 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14170 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
14180 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
14190 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
141a0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
141b0 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20 29     if( bDelete )
141c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
141d0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
141e0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
141f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
14200 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14210 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
14220 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
14230 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
14240 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
14250 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
14260 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
14270 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14280 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c  dbSize==0 && sql
14290 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
142a0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
142b0 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  he)>0 ){.    PgH
142c0 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 50  dr *p = sqlite3P
142d0 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
142e0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
142f0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67   ){.      p->pag
14300 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20  eHash = 0;.     
14310 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
14320 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20  efNotNull(p);.  
14330 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
14340 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
14350 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
14360 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
14370 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
14380 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
14390 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nRec = 0;.  sqli
143a0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
143b0 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
143c0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e);.  sqlite3Pca
143d0 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67  cheTruncate(pPag
143e0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61  er->pPCache, pPa
143f0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20  ger->dbSize);.. 
14400 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
14410 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
14420 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20  /* Drop the WAL 
14430 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61  write-lock, if a
14440 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  ny. Also, if the
14450 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
14460 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69  in .    ** locki
14470 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
14480 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f  e mode but is no
14490 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68   longer, drop th
144a0 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  e EXCLUSIVE .   
144b0 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e   ** lock held on
144c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
144d0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  le..    */.    r
144e0 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45  c2 = sqlite3WalE
144f0 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  ndWriteTransacti
14500 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
14510 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
14520 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  2==SQLITE_OK );.
14530 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
14540 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f  SQLITE_OK && bCo
14550 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d 3e  mmit && pPager->
14560 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67 65  dbFileSize>pPage
14570 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
14580 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
14590 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63 6f  is taken when co
145a0 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
145b0 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61  action in rollba
145c0 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ck-journal.    *
145d0 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64 61  * mode if the da
145e0 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
145f0 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74 68  isk is larger th
14600 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
14610 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41 74  image..    ** At
14620 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
14630 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
14640 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 74   finalized and t
14650 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
14660 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
14670 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20 62  lly committed, b
14680 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  ut the EXCLUSIVE
14690 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20 68   lock is still h
146a0 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  eld on the.    *
146b0 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69 73  * file. So it is
146c0 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61 74   safe to truncat
146d0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
146e0 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d  ile to its minim
146f0 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  um.    ** requir
14700 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20  ed size.  */.   
14710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14720 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
14730 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  E_LOCK );.    rc
14740 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
14750 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
14760 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
14770 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14780 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26  _OK && bCommit &
14790 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
147a0 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  >fd) ){.    rc =
147b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
147c0 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
147d0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  , SQLITE_FCNTL_C
147e0 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c 20  OMMIT_PHASETWO, 
147f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
14800 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
14810 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
14820 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
14830 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
14840 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67  ode .   && (!pag
14850 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
14860 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78   || sqlite3WalEx
14870 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
14880 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20  er->pWal, 0)).  
14890 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  ){.    rc2 = pag
148a0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
148b0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
148c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
148d0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
148e0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
148f0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
14900 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d  EADER;.  pPager-
14910 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
14920 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
14930 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
14940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
14950 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
14960 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
14970 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
14980 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
14990 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
149a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
149b0 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
149c0 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
149d0 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  te, do not attem
149e0 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  pt .** the rollb
149f0 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65  ack at this time
14a00 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72  . Instead, pager
14a10 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c  _unlock() is cal
14a20 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  led. The.** call
14a30 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
14a40 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20  () will discard 
14a50 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
14a60 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74  ges, unlock.** t
14a70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14a80 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61   and move the pa
14a90 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e  ger back to OPEN
14aa0 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20   state. If this 
14ab0 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
14ac0 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f  here is a hot-jo
14ad0 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68  urnal left in th
14ae0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  e file-system, t
14af0 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e  he next .** conn
14b00 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  ection to obtain
14b10 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
14b20 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
14b30 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
14b40 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c  ne) .** will rol
14b50 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
14b60 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
14b70 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e  s not already en
14b80 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
14b90 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f  state, but an IO
14ba0 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   or.** malloc er
14bb0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
14bc0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
14bd0 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73  en this will its
14be0 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68  elf cause .** th
14bf0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
14c00 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
14c10 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20  . Which will be 
14c20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a  cleared by the.*
14c30 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
14c40 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73  unlock(), as des
14c50 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f  cribed above..*/
14c60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
14c70 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
14c80 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
14c90 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
14ca0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
14cb0 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d  ERROR && pPager-
14cc0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
14cd0 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PEN ){.    asser
14ce0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
14cf0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
14d00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
14d10 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
14d20 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
14d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
14d40 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
14d50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
14d60 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
14d70 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
14d80 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
14d90 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  oc();.    }else 
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 29 7b 0a 20 20  lusiveMode ){.  
14dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14dd0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
14de0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
14df0 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
14e00 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
14e10 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
14e20 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  .  pager_unlock(
14e30 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
14e40 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
14e50 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
14e60 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
14e70 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
14e80 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
14e90 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
14ea0 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
14eb0 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
14ec0 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
14ed0 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
14ee0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
14ef0 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
14f00 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
14f10 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
14f20 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
14f30 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
14f40 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
14f50 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
14f60 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
14f70 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
14f80 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
14f90 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
14fa0 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
14fb0 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
14fc0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
14fd0 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
14fe0 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
14ff0 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
15000 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
15010 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
15020 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
15030 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
15040 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
15050 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
15060 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
15070 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
15080 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
15090 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
150a0 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
150b0 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
150c0 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
150d0 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
150e0 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
150f0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
15100 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
15110 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
15120 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
15130 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
15140 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
15150 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
15160 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
15170 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
15180 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
15190 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
151a0 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
151b0 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
151c0 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
151d0 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
151e0 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
151f0 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
15200 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
15210 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
15220 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
15230 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
15240 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
15250 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
15260 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
15270 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
15280 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
15290 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
152a0 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
152b0 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
152c0 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
152d0 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
152e0 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
152f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  }../*.** Report 
15300 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
15310 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72   size and number
15320 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
15330 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68  es back.** to th
15340 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64  e codec..*/.#ifd
15350 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
15360 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEC.static void 
15370 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
15380 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15390 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
153a0 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a  odecSizeChng ){.
153b0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64      pPager->xCod
153c0 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65  ecSizeChng(pPage
153d0 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65  r->pCodec, pPage
153e0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61          (int)pPa
15410 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a  ger->nReserve);.
15420 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
15430 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74  fine pagerReport
15440 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e  Size(X)     /* N
15450 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f  o-op if we do no
15460 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65  t support a code
15470 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c */.#endif../*.
15480 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
15490 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65   page from eithe
154a0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
154b0 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  le (if isMainJrn
154c0 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d  l==1) or.** from
154d0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
154e0 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
154f0 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b  =0) and playback
15500 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54   that page..** T
15510 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61  he page begins a
15520 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65  t offset *pOffse
15530 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  t into the file.
15540 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a   The *pOffset.**
15550 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
15560 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  sed to the start
15570 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
15580 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
15590 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
155a0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
155b0 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73  l uses checksums
155c0 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74   - the statement
155d0 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a   journal does .*
155e0 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  * not..**.** If 
155f0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
15600 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  of the page reco
15610 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  rd read from the
15620 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
15630 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
15640 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
15650 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
15660 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70  r.dbSize, then p
15670 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b  layback is.** sk
15680 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45  ipped and SQLITE
15690 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
156a0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20  .**.** If pDone 
156b0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
156c0 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64  n it is a record
156d0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
156e0 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  ave already.** b
156f0 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  een played back.
15700 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74    If the page at
15710 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c   *pOffset has al
15720 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
15730 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68  d back.** (if th
15740 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
15750 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74  pDone bit is set
15760 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
15770 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b  playback..** Mak
15780 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65  e sure the pDone
15790 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
157a0 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73  ng to the *pOffs
157b0 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a  et page is set.*
157c0 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72  * prior to retur
157d0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ning..**.** If t
157e0 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  he page record i
157f0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
15800 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
15810 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
15820 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61  ** and played ba
15830 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ck, then SQLITE_
15840 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
15850 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
15860 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72  ccurs.** while r
15870 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72  eading the recor
15880 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
15890 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72  )journal file or
158a0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a   while writing.*
158b0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
158c0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  e file, then the
158d0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
158e0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64  s returned. If d
158f0 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73  ata.** is succes
15900 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
15910 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
15920 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65  al file but appe
15930 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72  ars to be.** cor
15940 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
15950 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
15960 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65   Data is conside
15970 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e  red corrupted in
15980 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74  .** two circumst
15990 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  ances:.** .**   
159a0 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
159b0 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69  page-number is i
159c0 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47  llegal (0 or PAG
159d0 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a  ER_MJ_PGNO), or.
159e0 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65  **   * If the re
159f0 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f  cord is being ro
15a00 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  lled back from t
15a10 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
15a20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20  file.**     and 
15a30 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65  the checksum fie
15a40 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ld does not matc
15a50 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e  h the record con
15a60 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74  tent..**.** Neit
15a70 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f  her of these two
15a80 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70   scenarios are p
15a90 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61  ossible during a
15aa0 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
15ab0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
15ac0 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  is is a savepoin
15ad0 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  t rollback, then
15ae0 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65   memory may have
15af0 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
15b00 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  ly.** allocated 
15b10 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
15b20 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
15b30 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c   case and an all
15b40 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a  ocation fails,.*
15b50 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
15b60 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
15b70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
15b80 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
15b90 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
15ba0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
15bb0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
15bc0 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63  being played bac
15bd0 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66  k */.  i64 *pOff
15be0 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
15bf0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
15c00 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79  f record to play
15c10 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63  back */.  Bitvec
15c20 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20   *pDone,        
15c30 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65          /* Bitve
15c40 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
15c50 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  dy played back *
15c60 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72  /.  int isMainJr
15c70 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nl,             
15c80 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a    /* 1 -> main j
15c90 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62  ournal. 0 -> sub
15ca0 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69  -journal. */.  i
15cb0 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20  nt isSavepnt    
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15cd0 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70  True for a savep
15ce0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  oint rollback */
15cf0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
15d00 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15d20 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
15d30 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
15d40 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d60 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
15d70 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
15d80 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
15d90 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15db0 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
15dc0 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
15dd0 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61  g */.  char *aDa
15de0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
15df0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
15e00 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68  y storage for th
15e10 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69  e page */.  sqli
15e20 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20  te3_file *jfd;  
15e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15e40 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15e50 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
15e60 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
15e70 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20  sSynced;        
15e80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
15e90 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65   if journal page
15ea0 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20   is synced */.. 
15eb0 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e   assert( (isMain
15ec0 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20  Jrnl&~1)==0 );  
15ed0 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e      /* isMainJrn
15ee0 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  l is 0 or 1 */. 
15ef0 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76 65   assert( (isSave
15f00 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20  pnt&~1)==0 );   
15f10 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74      /* isSavepnt
15f20 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20   is 0 or 1 */.  
15f30 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72  assert( isMainJr
15f40 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20  nl || pDone );  
15f50 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61     /* pDone alwa
15f60 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a  ys used on sub-j
15f70 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73  ournals */.  ass
15f80 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c  ert( isSavepnt |
15f90 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20  | pDone==0 );   
15fa0 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75  /* pDone never u
15fb0 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70  sed on non-savep
15fc0 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61  oint */..  aData
15fd0 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
15fe0 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20  pace;.  assert( 
15ff0 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20  aData );        
16000 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
16010 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
16020 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
16030 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  d */.  assert( p
16040 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
16050 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69  r)==0 || (!isMai
16060 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70  nJrnl && isSavep
16070 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74  nt) );..  /* Eit
16080 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69 73  her the state is
16090 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 41   greater than PA
160a0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
160b0 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74 69  MOD (a transacti
160c0 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65  on .  ** or save
160d0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64  point rollback d
160e0 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75 65  one at the reque
160f0 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  st of the caller
16100 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a  ) or this is.  *
16110 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
16120 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20  rollback. If it 
16130 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
16140 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
16150 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20  ager.  ** is in 
16160 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68  state OPEN and h
16170 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56  olds an EXCLUSIV
16180 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72  E lock. Hot-jour
16190 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  nal rollback.  *
161a0 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f  * only reads fro
161b0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
161c0 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d  al, not the sub-
161d0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
161e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
161f0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
16200 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
16210 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
16220 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
16230 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65  PEN && pPager->e
16240 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
16250 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73  LOCK).  );.  ass
16260 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
16270 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
16280 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73  R_CACHEMOD || is
16290 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f  MainJrnl );..  /
162a0 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20  * Read the page 
162b0 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
162c0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f  data from the jo
162d0 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
162e0 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20  rnal.  ** file. 
162f0 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
16300 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
16310 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  er if an IO erro
16320 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20  r occurs..  */. 
16330 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e   jfd = isMainJrn
16340 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  l ? pPager->jfd 
16350 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a  : pPager->sjfd;.
16360 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
16370 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c  s(jfd, *pOffset,
16380 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
16390 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
163a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
163b0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
163c0 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20  fd, (u8*)aData, 
163d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
163e0 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b  , (*pOffset)+4);
163f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16400 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
16410 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20  ;.  *pOffset += 
16420 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16430 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e   + 4 + isMainJrn
16440 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  l*4;..  /* Sanit
16450 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
16460 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
16470 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
16480 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
16490 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
164a0 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
164b0 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
164c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
164d0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
164e0 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
164f0 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
16500 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
16510 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
16520 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
16530 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
16540 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
16550 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
16560 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
16570 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
16580 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
16590 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
165a0 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
165b0 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  ( !isSavepnt );.
165c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
165d0 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66  E_DONE;.  }.  if
165e0 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61  ( pgno>(Pgno)pPa
165f0 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73  ger->dbSize || s
16600 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
16610 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b  (pDone, pgno) ){
16620 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16630 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
16640 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
16650 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
16660 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65  ts(jfd, (*pOffse
16670 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  t)-4, &cksum);. 
16680 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
16690 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21  rn rc;.    if( !
166a0 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67  isSavepnt && pag
166b0 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
166c0 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b   (u8*)aData)!=ck
166d0 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
166e0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
166f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16700 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68 61   If this page ha
16710 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
16720 6c 61 79 65 64 20 62 61 63 6b 20 62 65 66 6f 72  layed back befor
16730 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  e during the cur
16740 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  rent.  ** rollba
16750 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62  ck, then don't b
16760 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74  other to play it
16770 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a   back again..  *
16780 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26  /.  if( pDone &&
16790 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69   (rc = sqlite3Bi
167a0 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70  tvecSet(pDone, p
167b0 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  gno))!=SQLITE_OK
167c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
167d0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  c;.  }..  /* Whe
167e0 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70  n playing back p
167f0 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74  age 1, restore t
16800 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74  he nReserve sett
16810 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
16820 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72  gno==1 && pPager
16830 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38  ->nReserve!=((u8
16840 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a  *)aData)[20] ){.
16850 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
16860 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61  erve = ((u8*)aDa
16870 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67  ta)[20];.    pag
16880 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
16890 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
168a0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
168b0 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74  in CACHEMOD stat
168c0 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
168d0 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
168e0 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
168f0 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
16900 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
16910 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
16920 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
16930 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
16940 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
16950 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
16960 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
16970 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
16980 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
16990 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
169a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
169b0 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
169c0 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
169d0 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
169e0 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
169f0 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
16a00 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
16a10 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
16a20 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
16a30 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
16a40 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
16a50 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
16a60 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
16a70 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
16a80 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
16a90 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
16aa0 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
16ab0 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
16ac0 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
16ad0 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
16ae0 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
16af0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
16b00 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52  WRITER_DBMOD, WR
16b10 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72  ITER_FINISHED or
16b20 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65   OPEN state, the
16b30 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a  n we update the.
16b40 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65    ** pager cache
16b50 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e   if it exists an
16b60 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
16b70 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
16b80 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e  n marked .  ** n
16b90 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20  ot dirty. Since 
16ba0 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c  this code is onl
16bb0 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41  y executed in PA
16bc0 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66  GER_OPEN state f
16bd0 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  or.  ** a hot-jo
16be0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
16bf0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
16c00 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63   that the page-c
16c10 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20  ache is empty.  
16c20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
16c30 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65  is in OPEN state
16c40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
16c50 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
16c60 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
16c70 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
16c80 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
16c90 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
16ca0 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
16cb0 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
16cc0 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
16cd0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
16ce0 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
16cf0 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
16d00 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
16d10 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
16d20 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
16d30 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
16d40 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
16d50 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
16d60 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
16d70 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
16d80 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
16d90 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
16da0 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
16db0 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
16dc0 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
16dd0 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
16de0 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74  s are synced int
16df0 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  o the main rollb
16e00 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
16e10 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  .  Otherwise, a 
16e20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74  power loss might
16e30 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20   leave modified 
16e40 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a  data in the.  **
16e50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
16e60 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20  ithout an entry 
16e70 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
16e80 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e  journal that can
16e90 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68  .  ** restore th
16ea0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
16eb0 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e  s original form.
16ec0 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
16ed0 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65   must be.  ** me
16ee0 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
16ef0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16f00 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
16f10 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
16f20 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28  .  ** locked.  (
16f30 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
16f40 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
16f50 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c  e content is ful
16f60 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69  ly synced.  ** i
16f70 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
16f80 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
16f90 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
16fa0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c  t in cache or el
16fb0 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  se.  ** the page
16fc0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
16fd0 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a  edSync==0..  **.
16fe0 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a    ** 2008-04-14:
16ff0 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e    When attemptin
17000 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f  g to vacuum a co
17010 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
17020 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  ile, it.  ** is 
17030 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c  possible to fail
17040 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20   a statement on 
17050 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  a database that 
17060 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69  does not yet exi
17070 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  st..  ** Do not 
17080 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
17090 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   if database fil
170a0 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
170b0 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
170c0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
170d0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70  pPager) ){.    p
170e0 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
170f0 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74  .    pPg = sqlit
17100 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
17110 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  ager, pgno);.  }
17120 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
17130 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  | !MEMDB );.  as
17140 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
17150 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
17160 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20   || pPg==0 );.  
17170 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41  PAGERTRACE(("PLA
17180 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
17190 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e   hash(%08x) %s\n
171a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41  ",.           PA
171b0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
171c0 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
171d0 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
171e0 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61  Size, (u8*)aData
171f0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69  ),.           (i
17200 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d  sMainJrnl?"main-
17210 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f  journal":"sub-jo
17220 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20  urnal").  ));.  
17230 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
17240 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
17250 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
17260 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20  || (*pOffset <= 
17270 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
17280 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dr);.  }else{.  
17290 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50    isSynced = (pP
172a0 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d  g==0 || 0==(pPg-
172b0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
172c0 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a  EED_SYNC));.  }.
172d0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
172e0 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28  ger->fd).   && (
172f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
17300 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
17310 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
17320 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
17330 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64  ).   && isSynced
17340 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
17350 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
17360 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
17370 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ize;.    testcas
17380 65 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  e( !isSavepnt &&
17390 20 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d   pPg!=0 && (pPg-
173a0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
173b0 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20  D_SYNC)!=0 );.  
173c0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
173d0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
173e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
173f0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
17400 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74  ->fd, (u8 *)aDat
17410 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
17420 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20  ize, ofst);.    
17430 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
17440 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
17450 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
17460 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
17470 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
17480 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b  ager->pBackup ){
17490 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50  .      CODEC1(pP
174a0 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
174b0 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 3, rc=SQLITE_
174c0 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71  NOMEM);.      sq
174d0 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
174e0 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
174f0 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44  p, pgno, (u8*)aD
17500 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  ata);.      CODE
17510 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C2(pPager, aData
17520 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51  , pgno, 7, rc=SQ
17530 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74  LITE_NOMEM, aDat
17540 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  a);.    }.  }els
17550 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e  e if( !isMainJrn
17560 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20  l && pPg==0 ){. 
17570 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
17580 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61   a rollback of a
17590 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64   savepoint and d
175a0 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74  ata was not writ
175b0 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  ten to.    ** th
175c0 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
175d0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
175e0 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20  n-memory, there 
175f0 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20  is a potential. 
17600 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57     ** problem. W
17610 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
17620 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20  next fetched by 
17630 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
17640 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  , it .    ** wil
17650 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  l be read from t
17660 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17670 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d  , which may or m
17680 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a  ay not be .    *
17690 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20  * current. .    
176a0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  **.    ** There 
176b0 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  are a couple of 
176c0 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74  different ways t
176d0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20  his can happen. 
176e0 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20  All are quite.  
176f0 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68    ** obscure. Wh
17700 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79  en running in sy
17710 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
17720 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  this can only ha
17730 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20  ppen .    ** if 
17740 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74  the page is on t
17750 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20  he free-list at 
17760 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
17770 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
17780 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61  en.    ** popula
17790 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20  ted, then moved 
177a0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67  using sqlite3Pag
177b0 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20  erMovepage()..  
177c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
177d0 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61  solution is to a
177e0 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  dd an in-memory 
177f0 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68  page to the cach
17800 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20  e containing.   
17810 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73   ** the data jus
17820 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  t read from the 
17830 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72  sub-journal. Mar
17840 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
17850 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20  rty .    ** and 
17860 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71  if the pager req
17870 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d  uires a journal-
17880 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20  sync, then mark 
17890 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20  the page as .   
178a0 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20   ** requiring a 
178b0 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66  journal-sync bef
178c0 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65  ore it is writte
178d0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
178e0 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
178f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
17900 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
17910 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52  ll & SPILLFLAG_R
17920 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20  OLLBACK)==0 );. 
17930 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
17940 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c  Spill |= SPILLFL
17950 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  AG_ROLLBACK;.   
17960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17970 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72  erAcquire(pPager
17980 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29  , pgno, &pPg, 1)
17990 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
179a0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
179b0 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  l & SPILLFLAG_RO
179c0 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20 20  LLBACK)!=0 );.  
179d0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
179e0 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c  pill &= ~SPILLFL
179f0 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  AG_ROLLBACK;.   
17a00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17a10 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
17a20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26      pPg->flags &
17a30 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45  = ~PGHDR_NEED_RE
17a40 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  AD;.    sqlite3P
17a50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
17a60 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Pg);.  }.  if( p
17a70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
17a80 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
17a90 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
17aa0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
17ab0 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
17ac0 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
17ad0 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
17ae0 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
17af0 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
17b00 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
17b10 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
17b20 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
17b30 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
17b40 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
17b50 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
17b60 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
17b70 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
17b80 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
17b90 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
17ba0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
17bb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
17bc0 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44  d *pData;.    pD
17bd0 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
17be0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
17bf0 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20  ta, (u8*)aData, 
17c00 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17c10 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  );.    pPager->x
17c20 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20  Reiniter(pPg);. 
17c30 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e     if( isMainJrn
17c40 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74  l && (!isSavepnt
17c50 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50   || *pOffset<=pP
17c60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
17c70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
17c80 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
17c90 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20   this page were 
17ca0 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72  just restored fr
17cb0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20  om the main .   
17cc0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
17cd0 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e  le, then its con
17ce0 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20  tent must be as 
17cf0 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74  they were when t
17d00 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  he .      ** tra
17d10 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72  nsaction was fir
17d20 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68  st opened. In th
17d30 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d  is case we can m
17d40 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20  ark the page.   
17d50 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20     ** as clean, 
17d60 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c  since there will
17d70 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77   be no need to w
17d80 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74  rite it out to t
17d90 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
17da0 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  base..      **. 
17db0 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
17dc0 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74   one exception t
17dd0 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20  o this rule. If 
17de0 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
17df0 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a  g rolled.      *
17e00 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f  * back as part o
17e10 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f  f a savepoint (o
17e20 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c  r statement) rol
17e30 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20  lback from an . 
17e40 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64       ** unsynced
17e50 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
17e60 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
17e70 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  e, then it is no
17e80 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20  t safe.      ** 
17e90 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  to mark the page
17ea0 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20   as clean. This 
17eb0 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69  is because marki
17ec0 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20  ng the page as. 
17ed0 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69       ** clean wi
17ee0 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  ll clear the PGH
17ef0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
17f00 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  g. Since the pag
17f10 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c  e is.      ** al
17f20 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
17f30 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72  rnal file (recor
17f40 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  ded in Pager.pIn
17f50 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20  Journal) and.   
17f60 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
17f70 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
17f80 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68  s cleared, if th
17f90 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
17fa0 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67  n to.      ** ag
17fb0 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  ain within this 
17fc0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20  transaction, it 
17fd0 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61  will be marked a
17fe0 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20  s dirty but.    
17ff0 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
18000 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69  EED_SYNC flag wi
18010 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49  ll not be set. I
18020 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74  t could then pot
18030 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a  entially.      *
18040 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  * be written out
18050 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
18060 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69  se file before i
18070 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ts journal file.
18080 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74        ** segment
18090 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61   is synced. If a
180a0 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75   crash occurs du
180b0 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e  ring or followin
180c0 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a  g this,.      **
180d0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
180e0 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a  tion may ensue..
180f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
18100 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
18110 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
18120 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
18130 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
18140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
18150 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
18160 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  Pg);..    /* If 
18170 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c  this was page 1,
18180 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68   then restore th
18190 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
181a0 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20  .dbFileVers..   
181b0 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f   ** Do this befo
181c0 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e  re any decoding.
181d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
181e0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==1 ){.      mem
181f0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
18200 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29  ileVers, &((u8*)
18210 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f  pData)[24],sizeo
18220 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
18230 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  Vers));.    }.. 
18240 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65     /* Decode the
18250 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20   page just read 
18260 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20  from disk */.   
18270 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
18280 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
18290 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
182a0 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74  OMEM);.    sqlit
182b0 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
182c0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
182d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
182e0 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
182f0 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
18300 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
18310 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
18320 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
18330 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
18340 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
18350 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
18360 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
18370 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
18380 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
18390 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
183a0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
183b0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
183c0 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
183d0 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
183e0 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72  Argument zMaster
183f0 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61   may point to Pa
18400 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53  ger.pTmpSpace. S
18410 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73  o that buffer is
18420 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62   not .** availab
18430 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69  le for use withi
18440 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  n this function.
18450 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61  .**.** When a ma
18460 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18470 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74  e is created, it
18480 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
18490 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a  th the names .**
184a0 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63   of all of its c
184b0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f  hild journals, o
184c0 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72  ne after another
184d0 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75  , formatted as u
184e0 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64  tf-8 .** encoded
184f0 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f   text. The end o
18500 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  f each child jou
18510 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72  rnal file is mar
18520 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e  ked with a .** n
18530 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
18540 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20  te (0x00). i.e. 
18550 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
18560 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20  nts of a master 
18570 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
18580 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
18590 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20  n involving two 
185a0 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20  databases might 
185b0 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f  be:.**.**   "/ho
185c0 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75  me/bill/a.db-jou
185d0 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69  rnal\x00/home/bi
185e0 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/b.db-journal\
185f0 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73  x00".**.** A mas
18600 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18610 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c   may only be del
18620 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66  eted once all of
18630 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a   its child .** j
18640 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65  ournals have bee
18650 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
18660 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
18670 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e  on reads the con
18680 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
18690 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
186a0 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79   into .** memory
186b0 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75   and loops throu
186c0 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  gh each of the c
186d0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  hild journal nam
186e0 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  es. For.** each 
186f0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69  child journal, i
18700 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a  t checks if:.**.
18710 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
18720 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ild journal exis
18730 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a  ts, and if so.**
18740 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
18750 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  d journal contai
18760 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ns a reference t
18770 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
18780 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d   .**     file zM
18790 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61  aster.**.** If a
187a0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
187b0 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74  an be found that
187c0 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66   matches both of
187d0 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a   the criteria.**
187e0 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e   above, this fun
187f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
18800 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
18810 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c  hing. Otherwise,
18820 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63   if.** no such c
18830 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
18840 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20   be found, file 
18850 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74  zMaster is delet
18860 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66  ed from.** the f
18870 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67  ile-system using
18880 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
18890 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
188a0 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20  IO error within 
188b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
188c0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
188d0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
188e0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
188f0 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63  ates memory by c
18900 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61  alling sqlite3Ma
18910 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c  lloc(). If an al
18920 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c  location.** fail
18930 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
18940 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
18950 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f  erwise, if no IO
18960 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   or malloc error
18970 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c  s .** occur, SQL
18980 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
18990 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
189a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
189b0 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65  locates a single
189c0 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
189d0 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20   to load.** the 
189e0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
189f0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
18a00 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
18a10 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63   could be.** a c
18a20 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74  ouple of kilobyt
18a30 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e  es or so - poten
18a40 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68  tially larger th
18a50 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20  an the page .** 
18a60 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
18a70 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
18a80 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
18a90 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
18aa0 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74  Master){.  sqlit
18ab0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
18ac0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
18ad0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
18ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
18af0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
18b00 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
18b10 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  er;    /* Malloc
18b20 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  'd master-journa
18b30 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
18b40 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
18b50 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20  ile *pJournal;  
18b60 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69   /* Malloc'd chi
18b70 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld-journal file 
18b80 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
18b90 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
18ba0 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
18bb0 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
18bc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18bd0 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
18be0 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
18bf0 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
18c00 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18c10 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
18c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
18c30 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72  nter to one jour
18c40 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69  nal within MJ fi
18c50 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  le */.  char *zM
18c60 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
18c70 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f    /* Space to ho
18c80 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66  ld MJ filename f
18c90 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  rom a journal fi
18ca0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  le */.  int nMas
18cb0 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
18cc0 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73    /* Amount of s
18cd0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74  pace allocated t
18ce0 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a  o zMasterPtr[] *
18cf0 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
18d00 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20   space for both 
18d10 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64  the pJournal and
18d20 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65   pMaster file de
18d30 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20  scriptors..  ** 
18d40 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
18d50 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
18d60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
18d70 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  reading..  */.  
18d80 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
18d90 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
18da0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73  3MallocZero(pVfs
18db0 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
18dc0 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
18dd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
18de0 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
18df0 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
18e00 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
18e10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
18e20 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
18e30 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  se{.    const in
18e40 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
18e50 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
18e60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
18e70 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
18e80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
18e90 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
18ea0 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
18eb0 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
18ec0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18ed0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18ee0 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  out;..  /* Load 
18ef0 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
18f00 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
18f10 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
18f20 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c  ed from.  ** sql
18f30 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
18f40 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
18f50 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
18f60 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20    Also obtain.  
18f70 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ** sufficient sp
18f80 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50  ace (in zMasterP
18f90 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  tr) to hold the 
18fa0 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a  names of master.
18fb0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
18fc0 65 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  es extracted fro
18fd0 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61  m regular rollba
18fe0 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ck-journals..  *
18ff0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
19000 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74  OsFileSize(pMast
19010 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
19020 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
19030 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
19040 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19050 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70    nMasterPtr = p
19060 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
19070 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  1;.  zMasterJour
19080 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
19090 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
190a0 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20  al + nMasterPtr 
190b0 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61  + 1);.  if( !zMa
190c0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
190d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
190e0 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64  OMEM;.    goto d
190f0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19100 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d  }.  zMasterPtr =
19110 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &zMasterJournal
19120 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b  [nMasterJournal+
19130 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  1];.  rc = sqlit
19140 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72  e3OsRead(pMaster
19150 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
19160 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  , (int)nMasterJo
19170 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28  urnal, 0);.  if(
19180 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19190 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
191a0 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f  out;.  zMasterJo
191b0 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
191c0 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a  rnal] = 0;..  zJ
191d0 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
191e0 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65  Journal;.  while
191f0 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
19200 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
19210 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
19220 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20    int exists;.  
19230 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19240 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f  Access(pVfs, zJo
19250 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
19260 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
19270 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72  ists);.    if( r
19280 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19290 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
192a0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
192b0 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29      if( exists )
192c0 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  {.      /* One o
192d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
192e0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
192f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19300 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a  exists..      **
19310 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
19320 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
19330 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
19340 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
19350 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
19360 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
19370 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19380 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  l file..      */
19390 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20  .      int c;.  
193a0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
193b0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
193c0 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
193d0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
193e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
193f0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
19400 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
19410 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
19420 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19430 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19440 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
19450 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
19460 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
19470 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
19480 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
19490 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
194a0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
194b0 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(pJournal);. 
194c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
194d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
194e0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
194f0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
19500 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72       c = zMaster
19510 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72  Ptr[0]!=0 && str
19520 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
19530 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
19540 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20     if( c ){.    
19550 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
19560 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
19570 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
19580 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
19590 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  /.        goto d
195a0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
195b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
195c0 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c  zJournal += (sql
195d0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f  ite3Strlen30(zJo
195e0 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20  urnal)+1);.  }. 
195f0 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
19600 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63  e(pMaster);.  rc
19610 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
19620 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
19630 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  , 0);..delmaster
19640 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f  _out:.  sqlite3_
19650 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  free(zMasterJour
19660 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73  nal);.  if( pMas
19670 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
19680 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
19690 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
196a0 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c  !isOpen(pJournal
196b0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
196c0 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  _free(pMaster);.
196d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
196e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
196f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
19700 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61   to change the a
19710 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
19720 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
19730 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
19740 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c  system. This onl
19750 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63  y happens when c
19760 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
19770 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72  saction,.** or r
19780 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
19790 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75  ansaction (inclu
197a0 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63  ding rolling bac
197b0 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  k a hot-journal)
197c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ..**.** If the m
197d0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
197e0 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
197f0 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  r the pager is n
19800 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  ot in either.** 
19810 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74  DBMOD or OPEN st
19820 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
19830 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  on is a no-op. O
19840 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69  therwise, the si
19850 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  ze .** of the fi
19860 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  le is changed to
19870 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
19880 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
19890 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a  Size bytes). .**
198a0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   If the file on 
198b0 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  disk is currentl
198c0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50  y larger than nP
198d0 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  age pages, then 
198e0 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78  use the VFS.** x
198f0 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f  Truncate() metho
19900 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74  d to truncate it
19910 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d  ..**.** Or, it m
19920 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
19930 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
19940 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
19950 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65  r than .** nPage
19960 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65   pages. Some ope
19970 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
19980 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
19990 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
199a0 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f  f .** you try to
199b0 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65   truncate a file
199c0 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68   to some size th
199d0 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
199e0 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74  n it .** current
199f0 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74  ly is, so detect
19a00 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77   this case and w
19a10 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65  rite a single ze
19a20 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74  ro byte to .** t
19a30 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
19a40 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a  w file instead..
19a50 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
19a60 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ful, return SQLI
19a70 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20  TE_OK. If an IO 
19a80 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
19a90 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20  le modifying.** 
19aa0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19ab0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
19ac0 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
19ad0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
19ae0 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
19af0 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
19b00 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
19b10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19b20 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
19b30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
19b40 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
19b50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19b60 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
19b70 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69  READER );.  .  i
19b80 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
19b90 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50  ->fd) .   && (pP
19ba0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
19bb0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
19bc0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
19bd0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20  te==PAGER_OPEN) 
19be0 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75  .  ){.    i64 cu
19bf0 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69  rrentSize, newSi
19c00 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61  ze;.    int szPa
19c10 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
19c20 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72  eSize;.    asser
19c30 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
19c40 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
19c50 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a   );.    /* TODO:
19c60 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75   Is it safe to u
19c70 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  se Pager.dbFileS
19c80 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20  ize here? */.   
19c90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
19ca0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
19cb0 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65  fd, &currentSize
19cc0 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  );.    newSize =
19cd0 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61   szPage*(i64)nPa
19ce0 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
19cf0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
19d00 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a  rentSize!=newSiz
19d10 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  e ){.      if( c
19d20 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
19d30 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
19d40 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
19d50 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
19d60 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20   newSize);.     
19d70 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72 72   }else if( (curr
19d80 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c  entSize+szPage)<
19d90 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
19da0 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d      char *pTmp =
19db0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
19dc0 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  ce;.        mems
19dd0 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61  et(pTmp, 0, szPa
19de0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  ge);.        tes
19df0 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d  tcase( (newSize-
19e00 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65  szPage) == curre
19e10 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
19e20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
19e30 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20  Size-szPage) >  
19e40 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
19e50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19e60 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
19e70 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50  r->fd, pTmp, szP
19e80 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50  age, newSize-szP
19e90 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
19ea0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19eb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19ec0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
19ed0 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
19ee0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
19ef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19f00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61  *.** Return a sa
19f10 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  nitized version 
19f20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  of the sector-si
19f30 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46  ze of OS file pF
19f40 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75  ile. The.** retu
19f50 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61 72  rn value is guar
19f60 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65  anteed to lie be
19f70 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58  tween 32 and MAX
19f80 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f  _SECTOR_SIZE..*/
19f90 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74  .int sqlite3Sect
19fa0 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
19fb0 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
19fc0 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65  nt iRet = sqlite
19fd0 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46  3OsSectorSize(pF
19fe0 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74  ile);.  if( iRet
19ff0 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20  <32 ){.    iRet 
1a000 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69  = 512;.  }else i
1a010 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54  f( iRet>MAX_SECT
1a020 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61  OR_SIZE ){.    a
1a030 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f  ssert( MAX_SECTO
1a040 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20  R_SIZE>=512 );. 
1a050 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45     iRet = MAX_SE
1a060 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20  CTOR_SIZE;.  }. 
1a070 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a   return iRet;.}.
1a080 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
1a090 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65  alue of the Page
1a0a0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
1a0b0 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69  iable for the gi
1a0c0 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73  ven.** pager bas
1a0d0 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ed on the value 
1a0e0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
1a0f0 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68  xSectorSize meth
1a100 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65  od.** of the ope
1a110 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
1a120 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
1a130 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a   will be used .*
1a140 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  * to determine t
1a150 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67  he size and alig
1a160 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  nment of journal
1a170 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20   header and .** 
1a180 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
1a190 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63  ointers within c
1a1a0 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66  reated journal f
1a1b0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iles..**.** For 
1a1c0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
1a1d0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1a1e0 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77  ctor size is alw
1a1f0 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a  ays 512 bytes..*
1a200 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1a210 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72  for non-temporar
1a220 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66  y files, the eff
1a230 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1a240 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c  ze is.** the val
1a250 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
1a260 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29  he xSectorSize()
1a270 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20   method rounded 
1a280 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69  up to 32 if.** i
1a290 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33  t is less than 3
1a2a0 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f  2, or rounded do
1a2b0 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52  wn to MAX_SECTOR
1a2c0 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69  _SIZE if it.** i
1a2d0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d  s greater than M
1a2e0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
1a2f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1a300 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54 45  e has the SQLITE
1a310 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
1a320 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70 65  _OVERWRITE prope
1a330 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  rty, then set.**
1a340 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1a350 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74  ector size to it
1a360 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  s minimum value 
1a370 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72 70  (512).  The purp
1a380 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72  ose of.** pPager
1a390 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  ->sectorSize is 
1a3a0 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22 62  to define the "b
1a3b0 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66 20  last radius" of 
1a3c0 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69  bytes that.** mi
1a3d0 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61 20  ght change if a 
1a3e0 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68 69  crash occurs whi
1a3f0 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20  le writing to a 
1a400 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a  single byte in.*
1a410 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42  * that range.  B
1a420 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41 46  ut with POWERSAF
1a430 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65  E_OVERWRITE, the
1a440 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69 73   blast radius is
1a450 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69   zero.** (that i
1a460 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46 45  s what POWERSAFE
1a470 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73  _OVERWRITE means
1a480 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a  ), so we minimiz
1a490 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20  e the sector.** 
1a4a0 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77  size.  For backw
1a4b0 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
1a4c0 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  ty of the rollba
1a4d0 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
1a4e0 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61  format,.** we ca
1a4f0 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65 20  nnot reduce the 
1a500 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1a510 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e   size below 512.
1a520 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a530 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61  setSectorSize(Pa
1a540 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1a550 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1a560 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
1a570 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1a580 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1a590 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20  >tempFile.   || 
1a5a0 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
1a5b0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1a5c0 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20  pPager->fd) & . 
1a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1a5e0 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1a5f0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d  AFE_OVERWRITE)!=
1a600 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  0.  ){.    /* Se
1a610 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27  ctor size doesn'
1a620 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d  t matter for tem
1a630 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c  porary files. Al
1a640 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20  so, the file.   
1a650 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   ** may not have
1a660 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74   been opened yet
1a670 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
1a680 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65  the OsSectorSize
1a690 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ().    ** call w
1a6a0 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f  ill segfault. */
1a6b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
1a6c0 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20  torSize = 512;. 
1a6d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
1a6e0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
1a6f0 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69   sqlite3SectorSi
1a700 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
1a710 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
1a720 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
1a730 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
1a740 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
1a750 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
1a760 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
1a770 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
1a780 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
1a790 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
1a7a0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
1a7b0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
1a7c0 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
1a7d0 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
1a7e0 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
1a7f0 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
1a800 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1a810 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1a820 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a830 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
1a840 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
1a850 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
1a860 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
1a870 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
1a880 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1a890 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
1a8a0 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
1a8b0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
1a8c0 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
1a8d0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1a8e0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1a8f0 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
1a900 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
1a910 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
1a920 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
1a930 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
1a940 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
1a950 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
1a960 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
1a970 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
1a980 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
1a990 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
1a9a0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1a9b0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1a9c0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
1a9d0 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
1a9e0 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
1a9f0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
1aa00 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
1aa10 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1aa20 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1aa30 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  page size..**  (
1aa40 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67  7)  zero padding
1aa50 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74   out to the next
1aa60 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a   sector size..**
1aa70 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (8)  Zero or m
1aa80 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
1aa90 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
1aaa0 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
1aab0 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
1aac0 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
1aad0 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
1aae0 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
1aaf0 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
1ab00 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
1ab10 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
1ab20 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
1ab30 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
1ab40 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20  ean the first 7 
1ab50 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
1ab60 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
1ab70 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
1ab80 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1ab90 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  8th item..**.** 
1aba0 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
1abb0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
1abc0 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
1abd0 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
1abe0 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
1abf0 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
1ac00 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
1ac10 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
1ac20 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
1ac30 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
1ac40 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
1ac50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ac60 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
1ac70 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
1ac80 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
1ac90 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
1aca0 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
1acb0 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
1acc0 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
1acd0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1ace0 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
1acf0 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
1ad00 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
1ad10 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
1ad20 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
1ad30 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
1ad40 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
1ad50 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1ad60 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
1ad70 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
1ad80 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
1ad90 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
1ada0 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
1adb0 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
1adc0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
1add0 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
1ade0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
1adf0 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
1ae00 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
1ae10 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1ae20 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
1ae30 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
1ae40 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
1ae50 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
1ae60 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
1ae70 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
1ae80 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
1ae90 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
1aea0 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
1aeb0 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
1aec0 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
1aed0 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
1aee0 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
1aef0 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
1af00 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
1af10 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
1af20 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
1af30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1af40 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
1af50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1af60 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
1af70 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
1af80 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
1af90 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
1afa0 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
1afb0 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
1afc0 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
1afd0 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
1afe0 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
1aff0 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
1b000 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
1b010 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
1b020 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
1b030 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
1b040 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
1b050 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
1b060 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
1b070 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
1b080 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
1b090 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
1b0a0 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
1b0b0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
1b0c0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
1b0d0 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70  *.** The isHot p
1b0e0 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
1b0f0 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74  es that we are t
1b100 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  rying to rollbac
1b110 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74  k a journal.** t
1b120 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68  hat might be a h
1b130 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c  ot journal.  Or,
1b140 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
1b150 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
1b160 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62   .** preserved b
1b170 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41  ecause of JOURNA
1b180 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72  LMODE_PERSIST or
1b190 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55   JOURNALMODE_TRU
1b1a0 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65  NCATE..** If the
1b1b0 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20   journal really 
1b1c0 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68  is hot, reset th
1b1d0 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72  e pager cache pr
1b1e0 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62  ior rolling.** b
1b1f0 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e  ack any content.
1b200 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    If the journal
1b210 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69   is merely persi
1b220 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20  stent, no reset 
1b230 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f  is.** needed..*/
1b240 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1b250 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
1b260 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
1b270 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
1b280 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
1b290 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
1b2a0 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
1b2b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b2c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b2d0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
1b2e0 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
1b2f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b300 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
1b310 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
1b320 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
1b330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
1b340 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
1b350 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
1b360 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
1b370 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1b380 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
1b390 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
1b3a0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1b3b0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1b3c0 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
1b3d0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
1b3e0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1b3f0 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
1b400 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
1b410 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
1b420 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
1b430 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1b440 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
1b450 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
1b460 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52    int needPagerR
1b470 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  eset;      /* Tr
1b480 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65  ue to reset page
1b490 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20   prior to first 
1b4a0 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  page rollback */
1b4b0 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b  .  int nPlayback
1b4c0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
1b4d0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
1b4e0 61 67 65 73 20 72 65 73 74 6f 72 65 64 20 66 72  ages restored fr
1b4f0 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20  om journal */.. 
1b500 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
1b510 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
1b520 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
1b530 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
1b540 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
1b550 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
1b560 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
1b570 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1b580 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
1b590 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1b5a0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
1b5b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1b5c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
1b5d0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1b5e0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
1b5f0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1b600 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
1b610 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
1b620 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
1b630 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
1b640 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
1b650 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
1b660 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
1b670 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
1b680 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
1b690 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
1b6a0 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
1b6b0 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
1b6c0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
1b6d0 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
1b6e0 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
1b6f0 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
1b700 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
1b710 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
1b720 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
1b730 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
1b740 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
1b750 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
1b760 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
1b770 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
1b780 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1b790 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
1b7a0 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
1b7b0 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
1b7c0 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
1b7d0 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
1b7e0 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
1b7f0 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
1b800 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
1b810 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1b820 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
1b830 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
1b840 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
1b850 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
1b860 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1b870 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
1b880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1b890 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
1b8a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1b8b0 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
1b8c0 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
1b8d0 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
1b8e0 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
1b8f0 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
1b900 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
1b910 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
1b920 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
1b930 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b940 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
1b950 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
1b960 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
1b970 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
1b980 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
1b990 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
1b9a0 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
1b9b0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
1b9c0 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
1b9d0 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
1b9e0 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
1b9f0 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
1ba00 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a  ile( 1 ){.    /*
1ba10 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
1ba20 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
1ba30 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
1ba40 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
1ba50 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
1ba60 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
1ba70 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
1ba80 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
1ba90 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
1baa0 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
1bab0 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
1bac0 63 65 73 73 20 6d 75 73 74 20 68 61 76 65 20 66  cess must have f
1bad0 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
1bae0 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
1baf0 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
1bb00 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
1bb10 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1bb20 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
1bb30 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
1bb40 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74  dr(pPager, isHot
1bb50 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
1bb60 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
1bb70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
1bb80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1bb90 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1bba0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1bbb0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1bbc0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1bbd0 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
1bbe0 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
1bbf0 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
1bc00 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
1bc10 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1bc20 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
1bc30 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
1bc40 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
1bc50 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
1bc60 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
1bc70 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
1bc80 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
1bc90 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
1bca0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
1bcb0 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
1bcc0 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
1bcd0 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
1bce0 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
1bcf0 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
1bd00 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
1bd10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1bd20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1bd30 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1bd40 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
1bd50 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
1bd60 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
1bd70 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
1bd80 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1bd90 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1bda0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
1bdb0 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
1bdc0 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
1bdd0 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
1bde0 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
1bdf0 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20  ess and if this 
1be00 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61  is the final hea
1be10 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  der in the journ
1be20 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e  al, then it mean
1be30 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  s.    ** that th
1be40 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a  is part of the j
1be50 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1be60 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20   filled but has 
1be70 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20  not yet been.   
1be80 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69   ** synced to di
1be90 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65  sk.  Compute the
1bea0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1beb0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
1bec0 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73  maining.    ** s
1bed0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ize of the file.
1bee0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1bef0 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66  he third term of
1bf00 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64   the test was ad
1bf10 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65  ded to fix ticke
1bf20 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20  t #2565..    ** 
1bf30 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
1bf40 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c  k a hot journal,
1bf50 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20   nRec==0 always 
1bf60 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
1bf70 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b  ext.    ** chunk
1bf80 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1bf90 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61  contains zero pa
1bfa0 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  ges to be rolled
1bfb0 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20   back.  But.    
1bfc0 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  ** when doing a 
1bfd0 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65  ROLLBACK and the
1bfe0 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69   nRec==0 chunk i
1bff0 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b  s the last chunk
1c000 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
1c010 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73  ournal, it means
1c020 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1c030 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
1c040 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a  additional.    *
1c050 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65  * pages that nee
1c060 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  d to be rolled b
1c070 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
1c080 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1c090 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20   .    ** should 
1c0a0 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65  be computed base
1c0b0 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
1c0c0 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20   file size..    
1c0d0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1c0e0 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a  =0 && !isHot &&.
1c0f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c100 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
1c110 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1c120 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
1c130 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e  alOff ){.      n
1c140 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1c150 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
1c160 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
1c170 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
1c180 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1c190 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1c1a0 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
1c1b0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1c1c0 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
1c1d0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1c1e0 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ile back to its 
1c1f0 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
1c200 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1c210 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c220 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
1c230 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1c240 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
1c250 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
1c260 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1c270 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c280 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1c290 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1c2a0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
1c2b0 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
1c2c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
1c2d0 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
1c2e0 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
1c2f0 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
1c300 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64  to the .    ** d
1c310 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1c320 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a  /or page cache..
1c330 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75      */.    for(u
1c340 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29  =0; u<nRec; u++)
1c350 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64  {.      if( need
1c360 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20  PagerReset ){.  
1c370 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
1c380 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1c390 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65     needPagerRese
1c3a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
1c3b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1c3c0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1c3d0 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72  e(pPager,&pPager
1c3e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31  ->journalOff,0,1
1c3f0 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ,0);.      if( r
1c400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c410 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63          nPlaybac
1c420 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  k++;.      }else
1c430 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
1c440 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1c450 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1c460 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1c470 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
1c480 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
1c490 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
1c4a0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1c4b0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
1c4c0 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
1c4d0 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e  al has been trun
1c4e0 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74  cated, simply st
1c4f0 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20  op reading and. 
1c500 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1c510 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  essing the journ
1c520 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68  al. This might h
1c530 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75  appen if the jou
1c540 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20  rnal was.       
1c550 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65     ** not comple
1c560 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64  tely written and
1c570 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f   synced prior to
1c580 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68   a crash.  In th
1c590 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
1c5a0 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62 61  case, the databa
1c5b0 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e  se should have n
1c5c0 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
1c5d0 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  n in the.       
1c5e0 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63     ** first plac
1c5f0 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f  e so it is OK to
1c600 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20   simply abandon 
1c610 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f  the rollback. */
1c620 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1c630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1c640 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1c650 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1c660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1c670 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e   /* If we are un
1c680 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
1c690 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72  , quit and retur
1c6a0 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  n the error.    
1c6b0 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20        ** code.  
1c6c0 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
1c6d0 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
1c6e0 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
1c6f0 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
1c700 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68  so that no furth
1c710 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20  er harm will be 
1c720 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74  done.  Perhaps t
1c730 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20  he next.        
1c740 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20    ** process to 
1c750 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20  come along will 
1c760 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  be able to rollb
1c770 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ack the database
1c780 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1c790 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1c7a0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1c7b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1c7c0 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
1c7d0 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
1c7e0 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
1c7f0 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c  yback:.  /* Foll
1c800 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  owing a rollback
1c810 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
1c820 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61  ile should be ba
1c830 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e  ck in its origin
1c840 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72  al.  ** state pr
1c850 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
1c860 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
1c870 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74  ion, so invoke t
1c880 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  he.  ** SQLITE_F
1c890 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1c8a0 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d  D file-control m
1c8b0 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65  ethod to disable
1c8c0 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   the.  ** assert
1c8d0 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61  ion that the tra
1c8e0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1c8f0 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20   was modified.. 
1c900 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1c910 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
1c920 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1c930 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ds ){.    sqlite
1c940 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
1c950 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51  nt(pPager->fd,SQ
1c960 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1c970 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a  CHANGED,0);.  }.
1c980 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1c990 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73  this playback is
1c9a0 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d   happening autom
1c9b0 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65  atically as a re
1c9c0 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72  sult of an IO or
1c9d0 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   .  ** malloc er
1c9e0 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65  ror that occurre
1c9f0 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  d after the chan
1ca00 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75  ge-counter was u
1ca10 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a  pdated but .  **
1ca20 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
1ca30 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
1ca40 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
1ca50 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
1ca60 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
1ca70 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20  n may just have 
1ca80 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49  been reverted. I
1ca90 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69  f this happens i
1caa0 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a  n exclusive .  *
1cab0 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62  * mode, then sub
1cac0 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74  sequent transact
1cad0 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62  ions performed b
1cae0 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  y the connection
1caf0 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75   will not.  ** u
1cb00 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
1cb10 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e  -counter at all.
1cb20 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74   This may lead t
1cb30 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73  o cache inconsis
1cb40 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c  tency.  ** probl
1cb50 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72  ems for other pr
1cb60 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20  ocesses at some 
1cb70 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
1cb80 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20  ure. So, just.  
1cb90 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
1cba0 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c  has happened, cl
1cbb0 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f  ear the changeCo
1cbc0 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77  untDone flag now
1cbd0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1cbe0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1cbf0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
1cc00 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ile;..  if( rc==
1cc10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cc20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
1cc30 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1cc40 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1cc50 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1cc60 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1cc70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1cc80 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
1cc90 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1cca0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1ccb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ccc0 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  OK.   && (pPager
1ccd0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1cce0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
1ccf0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1cd00 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b  PAGER_OPEN).  ){
1cd10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1cd20 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67 65  3PagerSync(pPage
1cd30 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  r, 0);.  }.  if(
1cd40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cd50 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1cd60 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1cd70 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1cd80 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20  [0]!='\0', 0);. 
1cd90 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1cda0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1cdb0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1cdc0 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1cdd0 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20  [0] && res ){.  
1cde0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
1cdf0 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
1ce00 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
1ce10 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
1ce20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20  success,.    ** 
1ce30 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
1ce40 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
1ce50 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1ce60 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
1ce70 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
1ce80 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ter(pPager, zMas
1ce90 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ter);.    testca
1cea0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1ceb0 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  K );.  }.  if( i
1cec0 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63  sHot && nPlaybac
1ced0 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  k ){.    sqlite3
1cee0 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49  _log(SQLITE_NOTI
1cef0 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
1cf00 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20  ACK, "recovered 
1cf10 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73  %d pages from %s
1cf20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1cf30 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50     nPlayback, pP
1cf40 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
1cf50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
1cf60 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
1cf70 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
1cf80 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
1cf90 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
1cfa0 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
1cfb0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1cfc0 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
1cfd0 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69  ferent sector si
1cfe0 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ze.  ** value. R
1cff0 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
1d000 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
1d010 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
1d020 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53   */.  setSectorS
1d030 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ize(pPager);.  r
1d040 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1d050 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
1d060 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
1d070 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
1d080 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
1d090 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
1d0a0 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
1d0b0 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
1d0c0 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
1d0d0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1d0e0 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
1d0f0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1d100 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1d110 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
1d120 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
1d130 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
1d140 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
1d150 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
1d160 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d170 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
1d180 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
1d190 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
1d1a0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
1d1b0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
1d1c0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1d1d0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1d1e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1d1f0 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
1d200 72 20 2a 70 50 67 2c 20 75 33 32 20 69 46 72 61  r *pPg, u32 iFra
1d210 6d 65 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  me){.  Pager *pP
1d220 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1d230 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a  er; /* Pager obj
1d240 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
1d250 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a  ith page pPg */.
1d260 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
1d270 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f  g->pgno;       /
1d280 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
1d290 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72   read */.  int r
1d2a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1d2b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1d2c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1d2d0 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70  pgsz = pPager->p
1d2e0 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62  ageSize; /* Numb
1d2f0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72  er of bytes to r
1d300 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ead */..  assert
1d310 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1d320 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
1d330 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  & !MEMDB );.  as
1d340 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1d350 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 23 69 66  ger->fd) );..#if
1d360 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d370 5f 57 41 4c 0a 20 20 69 66 28 20 69 46 72 61 6d  _WAL.  if( iFram
1d380 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20  e ){.    /* Try 
1d390 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65  to pull the page
1d3a0 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d   from the write-
1d3b0 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20  ahead log. */.  
1d3c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1d3d0 6c 52 65 61 64 46 72 61 6d 65 28 70 50 61 67 65  lReadFrame(pPage
1d3e0 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c  r->pWal, iFrame,
1d3f0 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74   pgsz, pPg->pDat
1d400 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  a);.  }else.#end
1d410 69 66 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 69  if.  {.    i64 i
1d420 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  Offset = (pgno-1
1d430 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1d440 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
1d450 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1d460 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d  pPager->fd, pPg-
1d470 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f  >pData, pgsz, iO
1d480 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ffset);.    if( 
1d490 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1d4a0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1d4b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d4c0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
1d4d0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1d4e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1d4f0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
1d500 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73  ead is unsuccess
1d510 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46  ful, set the dbF
1d520 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d  ileVers[] to som
1d530 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ething.      ** 
1d540 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  that will never 
1d550 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20  be a valid file 
1d560 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65  version.  dbFile
1d570 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79  Vers[] is a copy
1d580 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74  .      ** of byt
1d590 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  es 24..39 of the
1d5a0 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65   database.  Byte
1d5b0 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20  s 28..31 should 
1d5c0 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20  always be.      
1d5d0 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73  ** zero or the s
1d5e0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1d5f0 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74  ase in page. Byt
1d600 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35  es 32..35 and 35
1d610 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68  ..39.      ** sh
1d620 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d  ould be page num
1d630 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e  bers which are n
1d640 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e  ever 0xffffffff.
1d650 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20    So filling.   
1d660 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62     ** pPager->db
1d670 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20  FileVers[] with 
1d680 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73  all 0xff bytes s
1d690 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20  hould suffice.. 
1d6a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1d6b0 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65   For an encrypte
1d6c0 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  d database, the 
1d6d0 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72  situation is mor
1d6e0 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65  e complex:  byte
1d6f0 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33  s.      ** 24..3
1d700 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1d710 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73  e are white nois
1d720 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62  e.  But the prob
1d730 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20  ability of.     
1d740 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 65 20   ** white noise 
1d750 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65  equaling 16 byte
1d760 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e  s of 0xff is van
1d770 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73  ishingly small s
1d780 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68  o.      ** we sh
1d790 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b  ould still be ok
1d7a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1d7b0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
1d7c0 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66  dbFileVers, 0xff
1d7d0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1d7e0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1d7f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d800 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
1d810 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
1d820 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d  ta)[24];.      m
1d830 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1d840 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
1d850 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
1d860 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d870 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1d880 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
1d890 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  Pg->pData, pgno,
1d8a0 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   3, rc = SQLITE_
1d8b0 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52  NOMEM);..  PAGER
1d8c0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1d8d0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1d8e0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1d8f0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1d900 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1d910 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1d920 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
1d930 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1d940 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1d950 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1d960 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1d970 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1d980 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1d990 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1d9a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70   rc;.}../*.** Up
1d9b0 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  date the value o
1d9c0 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1d9d0 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20  nter at offsets 
1d9e0 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20  24 and 92 in.** 
1d9f0 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1da00 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f  he sqlite versio
1da10 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
1da20 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  et 96..**.** Thi
1da30 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74  s is an uncondit
1da40 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53  ional update.  S
1da50 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65  ee also the page
1da60 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1da70 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  nter().** routin
1da80 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64  e which only upd
1da90 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
1daa0 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75  counter if the u
1dab0 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c  pdate is actuall
1dac0 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20  y.** needed, as 
1dad0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1dae0 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  e pPager->change
1daf0 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20  CountDone state 
1db00 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1db10 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77  tic void pager_w
1db20 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1db30 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  er(PgHdr *pPg){.
1db40 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1db50 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  nter;..  /* Incr
1db60 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1db70 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1db80 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1db90 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1dba0 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1dbb0 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1dbc0 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  8*)pPg->pPager->
1dbd0 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20  dbFileVers)+1;. 
1dbe0 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1dbf0 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32  r*)pPg->pData)+2
1dc00 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1dc10 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73  r);..  /* Also s
1dc20 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
1dc30 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
1dc40 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
1dc50 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73  nd in.  ** bytes
1dc60 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
1dc70 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1dc80 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
1dc90 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
1dca0 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
1dcb0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1dcc0 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1dcd0 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
1dce0 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  er);.  put32bits
1dcf0 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1dd00 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
1dd10 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
1dd20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1dd30 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1dd40 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1dd50 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1dd60 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1dd70 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1dd80 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1dd90 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1dda0 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1ddb0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1ddc0 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1ddd0 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1dde0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1ddf0 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1de00 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1de10 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1de20 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1de30 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1de40 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1de50 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1de60 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1de70 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1de80 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1de90 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1dea0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1deb0 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1dec0 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1ded0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1dee0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1def0 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1df00 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1df10 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1df20 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1df30 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1df40 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1df50 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1df60 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1df70 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1df80 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1df90 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1dfa0 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1dfb0 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1dfc0 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1dfd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1dfe0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1dff0 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1e000 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1e010 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1e020 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1e030 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65  ;.  pPg = sqlite
1e040 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
1e050 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28  ger, iPg);.  if(
1e060 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20   pPg ){.    if( 
1e070 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
1e080 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d  eRefcount(pPg)==
1e090 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
1e0a0 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
1e0b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e0c0 20 20 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d      u32 iFrame =
1e0d0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
1e0e0 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
1e0f0 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1e100 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72   pPg->pgno, &iFr
1e110 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
1e120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e130 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
1e140 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46  adDbPage(pPg, iF
1e150 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rame);.      }. 
1e160 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e180 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1e190 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ter(pPg);.      
1e1a0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
1e1b0 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
1e1c0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1e1d0 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1e1e0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1e1f0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1e200 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1e210 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1e220 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1e230 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1e240 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1e250 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1e260 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1e270 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1e280 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1e290 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1e2a0 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1e2b0 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1e2c0 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1e2d0 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1e2e0 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1e2f0 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1e300 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1e310 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1e320 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1e330 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1e340 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1e350 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1e360 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1e370 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1e380 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1e390 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1e3a0 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1e3b0 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1e3c0 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1e3d0 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1e3e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1e3f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e400 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1e410 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1e420 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1e430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e440 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1e450 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1e460 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e480 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1e490 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1e4a0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1e4b0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1e4c0 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1e4d0 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1e4e0 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1e4f0 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1e500 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1e510 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1e520 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1e530 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1e540 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1e550 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1e560 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1e570 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1e580 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1e590 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1e5a0 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1e5b0 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1e5c0 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1e5d0 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1e5e0 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1e5f0 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1e600 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1e610 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1e620 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1e630 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1e640 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1e650 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1e660 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
1e670 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1e680 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1e690 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77  r->pPCache);.  w
1e6a0 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72  hile( pList && r
1e6b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e6c0 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
1e6d0 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
1e6e0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1e6f0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f  UndoCallback((vo
1e700 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  id *)pPager, pLi
1e710 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70  st->pgno);.    p
1e720 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
1e730 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1e740 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1e750 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
1e760 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
1e770 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41  e3WalFrames(). A
1e780 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e  s well as loggin
1e790 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  g.** the content
1e7a0 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66  s of the list of
1e7b0 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79   pages headed by
1e7c0 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65   pList (connecte
1e7d0 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a  d by pDirty),.**
1e7e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
1e7f0 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69  otifies any acti
1e800 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ve backup proces
1e810 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ses that the pag
1e820 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67  es have.** chang
1e830 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ed. .**.** The l
1e840 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73  ist of pages pas
1e850 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f  sed into this ro
1e860 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20  utine is always 
1e870 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e  sorted by page n
1e880 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c  umber..** Hence,
1e890 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61   if page 1 appea
1e8a0 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  rs anywhere on t
1e8b0 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c  he list, it will
1e8c0 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61   be the first pa
1e8d0 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ge..*/ .static i
1e8e0 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  nt pagerWalFrame
1e8f0 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
1e900 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1e910 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1e920 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  ject */.  PgHdr 
1e930 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
1e940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1e950 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c  t of frames to l
1e960 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72  og */.  Pgno nTr
1e970 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
1e980 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1e990 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ase size after t
1e9a0 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  his commit */.  
1e9b0 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9d0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1e9e0 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29  is a commit */.)
1e9f0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea10 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1ea20 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73  de */.  int nLis
1ea30 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1ea40 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ea50 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c  r of pages in pL
1ea60 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ist */.  PgHdr *
1ea70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1ea80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1ea90 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67  looping over pag
1eaa0 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
1eab0 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b   pPager->pWal );
1eac0 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1ead0 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
1eae0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
1eaf0 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
1eb00 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63  e list is in acc
1eb10 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
1eb20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1eb30 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70   && p->pDirty; p
1eb40 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1eb50 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f   assert( p->pgno
1eb60 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67   < p->pDirty->pg
1eb70 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  no );.  }.#endif
1eb80 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ..  assert( pLis
1eb90 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20  t->pDirty==0 || 
1eba0 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66  isCommit );.  if
1ebb0 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  ( isCommit ){.  
1ebc0 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72    /* If a WAL tr
1ebd0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
1ebe0 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  ng committed, th
1ebf0 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
1ec00 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a  in writing.    *
1ec10 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68  * any pages with
1ec20 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
1ec30 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e  eater than nTrun
1ec40 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41  cate into the WA
1ec50 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54  L file..    ** T
1ec60 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hey will never b
1ec70 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c  e read by any cl
1ec80 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20  ient. So remove 
1ec90 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44  them from the pD
1eca0 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74  irty.    ** list
1ecb0 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67   here. */.    Pg
1ecc0 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26  Hdr **ppNext = &
1ecd0 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74  pList;.    nList
1ece0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d   = 0;.    for(p=
1ecf0 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20  pList; (*ppNext 
1ed00 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44  = p)!=0; p=p->pD
1ed10 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28  irty){.      if(
1ed20 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63   p->pgno<=nTrunc
1ed30 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
1ed40 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72  pNext = &p->pDir
1ed50 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73  ty;.        nLis
1ed60 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
1ed70 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1ed80 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
1ed90 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a  .    nList = 1;.
1eda0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53    }.  pPager->aS
1edb0 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57  tat[PAGER_STAT_W
1edc0 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a  RITE] += nList;.
1edd0 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67  .  if( pList->pg
1ede0 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72  no==1 ) pager_wr
1edf0 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
1ee00 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d  r(pList);.  rc =
1ee10 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1ee20 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  s(pPager->pWal, 
1ee30 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
1ee40 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20  ageSize, pList, 
1ee50 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d  nTruncate, isCom
1ee60 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c  mit, pPager->wal
1ee70 53 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20  SyncFlags.  );. 
1ee80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ee90 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42  OK && pPager->pB
1eea0 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72  ackup ){.    for
1eeb0 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1eec0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1eed0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
1eee0 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
1eef0 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28  ckup, p->pgno, (
1ef00 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a  u8 *)p->pData);.
1ef10 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
1ef20 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1ef30 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73  AGES.  pList = s
1ef40 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1ef50 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1ef60 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Cache);.  for(p=
1ef70 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
1ef80 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65  Dirty){.    page
1ef90 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
1efa0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1efb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1efc0 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61  *.** Begin a rea
1efd0 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  d transaction on
1efe0 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20   the WAL..**.** 
1eff0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
1f000 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22  d to be called "
1f010 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f  pagerOpenSnapsho
1f020 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20  t()" because it 
1f030 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d  essentially.** m
1f040 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20  akes a snapshot 
1f050 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f060 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
1f070 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64  oint in time and
1f080 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68   preserves.** th
1f090 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20  at snapshot for 
1f0a0 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65  use by the reade
1f0b0 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f  r in spite of co
1f0c0 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67  ncurrently chang
1f0d0 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77  es by.** other w
1f0e0 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70  riters or checkp
1f0f0 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  ointers..*/.stat
1f100 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69  ic int pagerBegi
1f110 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
1f120 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1f130 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f150 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1f160 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67  e */.  int chang
1f170 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
1f180 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1f190 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  f cache must be 
1f1a0 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  reset */..  asse
1f1b0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1f1c0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
1f1d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f1e0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1f1f0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1f200 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
1f210 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33  );..  /* sqlite3
1f220 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
1f230 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20  ction() was not 
1f240 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70  called for the p
1f250 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61  revious.  ** tra
1f260 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b  nsaction in lock
1f270 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
1f280 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20  VE.  So call it 
1f290 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a  now.  If we.  **
1f2a0 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f   are in locking_
1f2b0 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20  mode=NORMAL and 
1f2c0 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72  EndRead() was pr
1f2d0 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c  eviously called,
1f2e0 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63  .  ** the duplic
1f2f0 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d  ate call is harm
1f300 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  less..  */.  sql
1f310 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
1f320 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1f330 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d  ->pWal);..  rc =
1f340 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e   sqlite3WalBegin
1f350 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1f360 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63  pPager->pWal, &c
1f370 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72  hanged);.  if( r
1f380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1f390 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70  changed ){.    p
1f3a0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1f3b0 72 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46  r);.    if( USEF
1f3c0 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73  ETCH(pPager) ) s
1f3d0 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
1f3e0 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30  pPager->fd, 0, 0
1f3f0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1f400 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
1f410 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1f420 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  on is called as 
1f430 70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  part of the tran
1f440 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45  sition from PAGE
1f450 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47  R_OPEN.** to PAG
1f460 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20  ER_READER state 
1f470 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1f480 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1f490 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e  abase file.** in
1f4a0 20 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67   pages (assuming
1f4b0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63   the page size c
1f4c0 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
1f4d0 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  in Pager.pageSiz
1f4e0 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  e)..**.** If no 
1f4f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
1f500 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1f510 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65  ned and the size
1f520 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f530 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20  .** in pages is 
1f540 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67  stored in *pnPag
1f550 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  e. Otherwise, an
1f560 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72   error code (per
1f570 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49  haps.** SQLITE_I
1f580 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73 20 72  OERR_FSTAT) is r
1f590 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50  eturned and *pnP
1f5a0 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  age is left unmo
1f5b0 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  dified..*/.stati
1f5c0 63 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63  c int pagerPagec
1f5d0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
1f5e0 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65  er, Pgno *pnPage
1f5f0 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  ){.  Pgno nPage;
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f610 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
1f620 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50   return via *pnP
1f630 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65  age */..  /* Que
1f640 72 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  ry the WAL sub-s
1f650 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61  ystem for the da
1f660 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65  tabase size. The
1f670 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a   WalDbsize().  *
1f680 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
1f690 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57  ns zero if the W
1f6a0 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28  AL is not open (
1f6b0 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d  i.e. Pager.pWal=
1f6c0 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20  =0), or.  ** if 
1f6d0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1f6e0 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
1f6f0 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  le. The database
1f700 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a   size is not.  *
1f710 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  * available from
1f720 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1f730 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66  tem if the log f
1f740 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a  ile is empty or.
1f750 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
1f760 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64   valid committed
1f770 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20   transactions.. 
1f780 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1f790 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1f7a0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
1f7b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
1f7c0 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
1f7d0 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71   );.  nPage = sq
1f7e0 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70  lite3WalDbsize(p
1f7f0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
1f800 20 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   /* If the numbe
1f810 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1f820 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1f830 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  t available from
1f840 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75   the.  ** WAL su
1f850 62 2d 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d  b-system, determ
1f860 69 6e 65 20 74 68 65 20 70 61 67 65 20 63 6f 75  ine the page cou
1f870 6e 74 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  nte based on the
1f880 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68   size of.  ** th
1f890 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1f8a0 20 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66    If the size of
1f8b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f8c0 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a  le is not an.  *
1f8d0 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  * integer multip
1f8e0 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
1f8f0 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70 20 74 68  ize, round up th
1f900 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20  e result..  */. 
1f910 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
1f920 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20  .    i64 n = 0; 
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f940 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
1f950 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1f960 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
1f970 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1f980 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1f990 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
1f9a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1f9b0 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  d) ){.      int 
1f9c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1f9d0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1f9e0 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66  d, &n);.      if
1f9f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fa00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1fa10 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1fa20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20    }.    nPage = 
1fa30 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72  (Pgno)((n+pPager
1fa40 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20  ->pageSize-1) / 
1fa50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1fa60 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
1fa70 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
1fa80 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1fa90 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
1faa0 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a  er than the.  **
1fab0 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
1fac0 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
1fad0 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
1fae0 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
1faf0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
1fb00 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
1fb10 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
1fb20 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
1fb30 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
1fb40 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
1fb50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50  age;.  }..  *pnP
1fb60 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
1fb70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fb80 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1fb90 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1fba0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
1fbb0 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
1fbc0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
1fbd0 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
1fbe0 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
1fbf0 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
1fc00 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
1fc10 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
1fc20 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
1fc30 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
1fc40 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
1fc50 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
1fc60 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
1fc70 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
1fc80 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
1fc90 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
1fca0 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
1fcb0 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
1fcc0 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
1fcd0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1fce0 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
1fcf0 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
1fd00 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
1fd10 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1fd20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
1fd30 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
1fd40 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
1fd50 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
1fd60 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
1fd70 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
1fd80 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
1fd90 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
1fda0 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
1fdb0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1fdc0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
1fdd0 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
1fde0 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
1fdf0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1fe00 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
1fe10 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
1fe20 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
1fe30 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
1fe40 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
1fe50 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
1fe60 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
1fe70 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
1fe80 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
1fe90 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
1fea0 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
1feb0 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
1fec0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
1fed0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1fee0 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
1fef0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
1ff00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1ff10 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
1ff20 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1ff30 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
1ff40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ff50 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
1ff60 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21  LOCK );..  if( !
1ff70 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1ff80 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61   ){.    int isWa
1ff90 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1ffa0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1ffb0 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73   WAL file exists
1ffc0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   */.    Pgno nPa
1ffd0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1ffe0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1fff0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20000 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  le */..    rc = 
20010 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
20020 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
20030 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
20040 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
20050 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
20060 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20070 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
20080 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
20090 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  l, 0);.      if(
200a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
200b0 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29  R_DELETE_NOENT )
200c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
200d0 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30  .      isWal = 0
200e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
200f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
20100 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
20110 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c     pPager->pVfs,
20120 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53   pPager->zWal, S
20130 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
20140 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20  STS, &isWal.    
20150 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
20160 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20170 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
20180 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Wal ){.        t
20190 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
201a0 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
201b0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
201c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
201d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
201e0 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20  OpenWal(pPager, 
201f0 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
20200 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
20210 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
20220 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
20230 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
20240 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
20250 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20260 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  E_DELETE;.      
20270 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
20280 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
20290 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  f../*.** Playbac
202a0 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
202b0 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
202c0 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
202d0 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
202e0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
202f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20300 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
20310 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
20320 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
20330 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
20340 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
20350 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
20360 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
20370 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
20380 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
20390 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
203a0 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
203b0 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
203c0 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
203d0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
203e0 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
203f0 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
20400 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
20410 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
20420 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
20430 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
20440 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
20450 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
20460 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20470 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
20480 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
20490 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
204a0 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
204b0 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
204c0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
204d0 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
204e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
204f0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
20500 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
20510 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20520 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
20530 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
20540 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20550 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
20560 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
20570 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
20580 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
20590 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
205a0 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
205b0 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
205c0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
205d0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
205e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
205f0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
20600 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
20610 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
20620 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
20630 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
20640 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
20650 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
20660 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
20670 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
20680 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
20690 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
206a0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
206b0 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
206c0 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
206d0 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
206e0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
206f0 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
20700 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
20710 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
20720 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
20730 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
20740 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
20750 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
20760 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
20770 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
20780 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
20790 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
207a0 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
207b0 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
207c0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
207d0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
207e0 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
207f0 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
20800 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
20810 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
20820 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
20830 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
20840 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
20850 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
20860 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
20870 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
20880 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
20890 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
208a0 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
208b0 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
208c0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
208d0 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
208e0 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
208f0 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
20900 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
20910 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
20920 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
20930 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
20940 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
20950 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
20960 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
20970 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
20980 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
20990 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
209a0 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
209b0 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209d0 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
209e0 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
209f0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
20a00 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
20a10 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
20a20 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
20a30 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
20a40 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
20a50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
20a60 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
20a70 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
20a80 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
20a90 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
20aa0 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
20ab0 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
20ac0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
20ad0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
20ae0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
20af0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
20b00 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
20b10 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20  ER_LOCKED );..  
20b20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
20b30 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
20b40 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
20b50 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
20b60 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
20b70 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
20b80 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
20b90 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
20ba0 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
20bb0 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
20bc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
20bd0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
20be0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
20bf0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
20c00 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
20c10 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20  e it was before 
20c20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
20c30 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74   ** being revert
20c40 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20  ed was opened.. 
20c50 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
20c60 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e  Size = pSavepoin
20c70 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
20c80 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e  nOrig : pPager->
20c90 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50  dbOrigSize;.  pP
20ca0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
20cb0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
20cc0 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
20cd0 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20   !pSavepoint && 
20ce0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
20cf0 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
20d00 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  n pagerRollbackW
20d10 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
20d20 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72  .  /* Use pPager
20d30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20  ->journalOff as 
20d40 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69  the effective si
20d50 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72  ze of the main r
20d60 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
20d70 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61  rnal.  The actua
20d80 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20  l file might be 
20d90 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
20da0 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a   in.  ** PAGER_J
20db0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
20dc0 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55  ATE or PAGER_JOU
20dd0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
20de0 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a  .  But anything.
20df0 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72    ** past pPager
20e00 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  ->journalOff is 
20e10 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73  off-limits to us
20e20 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70  ..  */.  szJ = p
20e30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20e40 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  f;.  assert( pag
20e50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
20e60 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b  ==0 || szJ==0 );
20e70 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
20e80 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
20e90 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  ords from the ma
20ea0 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
20eb0 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65  ing at.  ** Page
20ec0 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
20ed0 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
20ee0 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f  g to the next jo
20ef0 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
20f00 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62  ** There might b
20f10 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
20f20 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68   main journal th
20f30 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e  at have a page n
20f40 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74  umber.  ** great
20f50 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
20f60 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a  ent database siz
20f70 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e (pPager->dbSiz
20f80 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a  e) but those.  *
20f90 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
20fa0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
20fb0 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65    Pages are adde
20fc0 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68  d to pDone as th
20fd0 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79  ey.  ** are play
20fe0 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
20ff0 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26  if( pSavepoint &
21000 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  & !pagerUseWal(p
21010 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48  Pager) ){.    iH
21020 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  drOff = pSavepoi
21030 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f  nt->iHdrOffset ?
21040 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
21050 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20  rOffset : szJ;. 
21060 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
21070 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  alOff = pSavepoi
21080 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  nt->iOffset;.   
21090 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
210a0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
210b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72  >journalOff<iHdr
210c0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Off ){.      rc 
210d0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
210e0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
210f0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
21100 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
21110 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
21120 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21130 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73  E_DONE );.  }els
21140 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e{.    pPager->j
21150 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
21160 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75   }..  /* Continu
21170 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  e rolling back r
21180 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68  ecords out of th
21190 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
211a0 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
211b0 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
211c0 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e  l header seen an
211d0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74  d continuing unt
211e0 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  il the effective
211f0 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65   end.  ** of the
21200 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
21210 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f  le.  Continue to
21220 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e   skip out-of-ran
21230 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a  ge pages and.  *
21240 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e  * continue addin
21250 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  g pages rolled b
21260 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20  ack to pDone..  
21270 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  */.  while( rc==
21280 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
21290 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
212a0 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69  szJ ){.    u32 i
212b0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
212c0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
212d0 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d  .    u32 nJRec =
212e0 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
212f0 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63  r of Journal Rec
21300 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20  ords */.    u32 
21310 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
21320 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
21330 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26  Pager, 0, szJ, &
21340 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
21350 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21360 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a  SQLITE_DONE );..
21370 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
21380 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e "pPager->journ
21390 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
213a0 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
213b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
213c0 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73  ".    ** test is
213d0 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b   related to tick
213e0 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74  et #2565.  See t
213f0 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e  he discussion in
21400 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
21410 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e  r_playback() fun
21420 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ction for additi
21430 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
21440 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21450 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20   nJRec==0 .     
21460 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
21470 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
21480 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
21490 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
214a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a  .    ){.      nJ
214b0 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a  Rec = (u32)((szJ
214c0 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
214d0 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50  alOff)/JOURNAL_P
214e0 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
214f0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
21500 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
21510 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20   && ii<nJRec && 
21520 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21530 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20  ff<szJ; ii++){. 
21540 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
21550 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
21560 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
21570 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
21580 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
21590 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
215a0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
215b0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
215c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
215d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
215e0 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f  Off>=szJ );..  /
215f0 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c  * Finally,  roll
21600 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20  back pages from 
21610 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
21620 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65    Page that were
21630 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  .  ** previously
21640 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74   rolled back out
21650 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
21660 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65  rnal (and are he
21670 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20  nce in pDone).  
21680 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
21690 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67  ed.  Out-of-rang
216a0 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f  e pages are also
216b0 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
216c0 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
216d0 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
216e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
216f0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
21700 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69   i64 offset = (i
21710 36 34 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  64)pSavepoint->i
21720 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
21730 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
21740 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
21750 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
21760 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
21770 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28  alSavepointUndo(
21780 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53  pPager->pWal, pS
21790 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61  avepoint->aWalDa
217a0 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ta);.    }.    f
217b0 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74  or(ii=pSavepoint
217c0 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53  ->iSubRec; rc==S
217d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70  QLITE_OK && ii<p
217e0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20  Pager->nSubRec; 
217f0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
21800 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 28 69 36  ert( offset==(i6
21810 34 29 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e  4)ii*(4+pPager->
21820 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20  pageSize) );.   
21830 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
21840 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
21850 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c  pPager, &offset,
21860 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20   pDone, 0, 1);. 
21870 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
21880 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
21890 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74   );.  }..  sqlit
218a0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
218b0 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63  pDone);.  if( rc
218c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
218d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
218e0 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  alOff = szJ;.  }
218f0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
21900 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
21910 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
21920 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
21930 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
21940 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lowed..*/.void s
21950 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
21960 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
21970 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
21980 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e){.  sqlite3Pca
21990 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28  cheSetCachesize(
219a0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
219b0 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a   mxPage);.}../*.
219c0 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45  ** Invoke SQLITE
219d0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
219e0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75   based on the cu
219f0 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73  rrent value of s
21a00 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  zMmap..*/.static
21a10 20 76 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61   void pagerFixMa
21a20 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  plimit(Pager *pP
21a30 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54  ager){.#if SQLIT
21a40 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
21a50 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  0.  sqlite3_file
21a60 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66   *fd = pPager->f
21a70 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  d;.  if( isOpen(
21a80 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68  fd) && fd->pMeth
21a90 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33  ods->iVersion>=3
21aa0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
21ab0 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a  int64 sz;.    sz
21ac0 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61   = pPager->szMma
21ad0 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62  p;.    pPager->b
21ae0 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30  UseFetch = (sz>0
21af0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
21b00 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
21b10 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
21b20 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
21b30 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65  ZE, &sz);.  }.#e
21b40 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ndif.}../*.** Ch
21b50 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
21b60 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d   size of any mem
21b70 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65  ory mapping made
21b80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21b90 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
21ba0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
21bb0 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  apLimit(Pager *p
21bc0 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69  Pager, sqlite3_i
21bd0 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20  nt64 szMmap){.  
21be0 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d  pPager->szMmap =
21bf0 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72   szMmap;.  pager
21c00 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67  FixMaplimit(pPag
21c10 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  er);.}../*.** Fr
21c20 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
21c30 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
21c40 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  om the pager..*/
21c50 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21c60 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a  erShrink(Pager *
21c70 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
21c80 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70  e3PcacheShrink(p
21c90 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
21ca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
21cb0 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68 65   settings of the
21cc0 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65 20   pager to those 
21cd0 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
21ce0 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65 74   pgFlags paramet
21cf0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c  er..**.** The "l
21d00 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67 73  evel" in pgFlags
21d10 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f   & PAGER_SYNCHRO
21d20 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20 74  NOUS_MASK sets t
21d30 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a  he robustness.**
21d40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21d50 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
21d60 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72 20  o OS crashes or 
21d70 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
21d80 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68  y.** changing th
21d90 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
21da0 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
21db0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a  g the journals..
21dc0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 68 72  ** There are thr
21dd0 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
21de0 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
21df0 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
21e00 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
21e10 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
21e20 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
21e30 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
21e40 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
21e50 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
21e60 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
21e70 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
21e80 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
21e90 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
21ea0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21eb0 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
21ec0 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
21ed0 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
21ee0 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
21ef0 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
21f00 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
21f10 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
21f20 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
21f30 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
21f40 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
21f50 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
21f60 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
21f70 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
21f80 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
21f90 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
21fa0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
21fb0 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
21fc0 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
21fd0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
21fe0 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
21ff0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
22000 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
22010 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
22020 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
22030 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
22040 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
22050 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
22060 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
22070 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
22080 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
22090 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
220a0 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
220b0 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
220c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
220d0 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
220e0 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
220f0 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
22100 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
22110 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
22120 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
22130 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
22140 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
22150 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
22160 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
22170 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
22180 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22190 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
221a0 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
221b0 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
221c0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
221d0 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20  he above is for 
221e0 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  a rollback-journ
221f0 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41  al mode.  For WA
22200 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74  L mode, OFF cont
22210 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e  inues.** to mean
22220 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65   that no syncs e
22230 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d  ver occur.  NORM
22240 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  AL means that th
22250 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a  e WAL is synced.
22260 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ** prior to the 
22270 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f  start of checkpo
22280 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65  int and that the
22290 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
222a0 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74  s synced.** at t
222b0 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
222c0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
222d0 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  if the entire co
222e0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c  ntent of the WAL
222f0 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20  .** was written 
22300 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
22310 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20  tabase.  But no 
22320 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20  sync operations 
22330 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20  occur for.** an 
22340 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20  ordinary commit 
22350 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77  in NORMAL mode w
22360 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d  ith WAL.  FULL m
22370 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
22380 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e  L.** file is syn
22390 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ced following ea
223a0 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74  ch commit operat
223b0 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e  ion, in addition
223c0 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73   to the.** syncs
223d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
223e0 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44   NORMAL..**.** D
223f0 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79  o not confuse sy
22400 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77  nchronous=FULL w
22410 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ith SQLITE_SYNC_
22420 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  FULL.  The.** SQ
22430 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d  LITE_SYNC_FULL m
22440 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73  acro means to us
22450 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79  e the MacOSX-sty
22460 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a  le full-fsync.**
22470 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46   using fcntl(F_F
22480 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49  ULLFSYNC).  SQLI
22490 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d  TE_SYNC_NORMAL m
224a0 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a  eans to do an.**
224b0 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28   ordinary fsync(
224c0 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69  ) call.  There i
224d0 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
224e0 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53  between SQLITE_S
224f0 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20  YNC_FULL.** and 
22500 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22510 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20  AL on platforms 
22520 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53  other than MacOS
22530 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73  X.  But the.** s
22540 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
22550 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f  versus synchrono
22560 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e  us=NORMAL settin
22570 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  g determines whe
22580 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70  n.** the xSync p
22590 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c  rimitive is call
225a0 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61  ed and is releva
225b0 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f  nt to all platfo
225c0 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  rms..**.** Numer
225d0 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
225e0 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
225f0 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
22600 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
22610 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
22620 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22630 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
22640 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
22650 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61  erSetFlags(.  Pa
22660 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
22670 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
22680 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c   to set safety l
22690 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e  evel for */.  un
226a0 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
226b0 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66      /* Various f
226c0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  lags */.){.  uns
226d0 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67  igned level = pg
226e0 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59  Flags & PAGER_SY
226f0 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a  NCHRONOUS_MASK;.
22700 20 20 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e    assert( level>
22710 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29  =1 && level<=3 )
22720 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
22730 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20  nc =  (level==1 
22740 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
22750 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  ile) ?1:0;.  pPa
22760 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
22770 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50  (level==3 && !pP
22780 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
22790 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70 50 61 67  ?1:0;.  if( pPag
227a0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
227b0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
227c0 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ags = 0;.    pPa
227d0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
227e0 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  gs = 0;.  }else 
227f0 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
22800 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b  GER_FULLFSYNC ){
22810 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22820 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22830 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70  SYNC_FULL;.    p
22840 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
22850 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
22860 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  NC_FULL;.  }else
22870 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
22880 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53  AGER_CKPT_FULLFS
22890 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65  YNC ){.    pPage
228a0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
228b0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
228c0 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  L;.    pPager->c
228d0 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
228e0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
228f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
22900 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
22910 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
22920 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
22930 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
22940 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
22950 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  RMAL;.  }.  pPag
22960 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
22970 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46   = pPager->syncF
22980 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67  lags;.  if( pPag
22990 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
229a0 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
229b0 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f  yncFlags |= WAL_
229c0 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e  SYNC_TRANSACTION
229d0 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46  S;.  }.  if( pgF
229e0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 41 43  lags & PAGER_CAC
229f0 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70  HESPILL ){.    p
22a00 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
22a10 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f  l &= ~SPILLFLAG_
22a20 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OFF;.  }else{.  
22a30 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
22a40 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
22a50 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  G_OFF;.  }.}.#en
22a60 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
22a70 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
22a80 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
22a90 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
22aa0 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
22ab0 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
22ac0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
22ad0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
22ae0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
22af0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
22b00 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
22b10 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
22b20 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
22b30 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
22b40 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
22b50 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
22b60 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
22b70 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
22b80 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
22b90 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
22ba0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
22bb0 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
22bc0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
22bd0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
22be0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
22bf0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
22c00 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
22c10 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
22c20 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
22c30 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
22c40 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
22c50 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
22c60 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
22c70 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
22c80 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
22c90 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
22ca0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
22cb0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
22cc0 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
22cd0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
22ce0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22cf0 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
22d00 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
22d10 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
22d20 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
22d30 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
22d40 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
22d50 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
22d60 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
22d70 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
22d80 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
22d90 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
22da0 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
22db0 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
22dc0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
22dd0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
22de0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e00 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
22e10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
22e20 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
22e30 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
22e40 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
22e50 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
22e60 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
22e70 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
22e80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
22e90 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
22ea0 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
22eb0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
22ec0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
22ed0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
22ee0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
22ef0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
22f00 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
22f10 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
22f20 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
22f30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22f40 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
22f50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
22f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
22f70 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
22f80 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
22f90 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
22fa0 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
22fb0 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
22fc0 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
22fd0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
22fe0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
22ff0 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
23000 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
23010 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
23020 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
23030 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
23040 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
23050 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
23060 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
23070 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
23080 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
23090 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
230a0 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
230b0 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
230c0 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
230d0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
230e0 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
230f0 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
23100 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
23110 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
23120 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
23140 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
23150 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
23160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23190 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
231a0 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
231b0 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
231c0 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
231d0 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
231e0 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
231f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
23200 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
23210 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
23220 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
23230 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
23240 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
23250 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
23260 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
23270 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
23280 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
23290 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
232a0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
232b0 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
232c0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
232d0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
232e0 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
232f0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
23300 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
23310 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
23320 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23340 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
23350 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
23360 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
23370 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
23380 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
23390 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
233a0 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
233b0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
233c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
233d0 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
233e0 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
233f0 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  */.){.  pPager->
23400 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
23410 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
23420 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
23430 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
23440 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28  ndlerArg;..  if(
23450 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
23460 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
23470 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29  **ap = (void **)
23480 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61  &pPager->xBusyHa
23490 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72  ndler;.    asser
234a0 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64  t( ((int(*)(void
234b0 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42   *))(ap[0]))==xB
234c0 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20  usyHandler );.  
234d0 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d    assert( ap[1]=
234e0 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  =pBusyHandlerArg
234f0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   );.    sqlite3O
23500 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
23510 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
23520 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41  ITE_FCNTL_BUSYHA
23530 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61  NDLER, (void *)a
23540 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
23550 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
23560 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
23570 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
23580 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  The new page siz
23590 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  e .** is passed 
235a0 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  in *pPageSize..*
235b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
235c0 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
235d0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
235e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
235f0 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61  lled, it.** is a
23600 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75   no-op. The valu
23610 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
23620 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
23630 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a  ror code (i.e. .
23640 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  ** one of SQLITE
23650 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54  _IOERR, an SQLIT
23660 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d  E_IOERR_xxx sub-
23670 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46  code or SQLITE_F
23680 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ULL)..**.** Othe
23690 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66  rwise, if all of
236a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
236b0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
236c0 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20   * the new page 
236d0 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a  size (value of *
236e0 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61  pPageSize) is va
236f0 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a  lid (a power .**
23700 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77       of two betw
23710 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49  een 512 and SQLI
23720 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
23730 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e  , inclusive), an
23740 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72  d.**.**   * ther
23750 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
23760 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
23770 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  nces, and.**.** 
23780 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
23790 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61   is either not a
237a0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
237b0 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a  base or it is.**
237c0 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72       an in-memor
237d0 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
237e0 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73  currently consis
237f0 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73  ts of zero pages
23800 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ..**.** then the
23810 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   pager object pa
23820 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
23830 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  o *pPageSize..**
23840 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
23850 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c  size is changed,
23860 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
23870 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33  ion uses sqlite3
23880 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a  PagerMalloc() .*
23890 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65  * to obtain a ne
238a0 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  w Pager.pTmpSpac
238b0 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69  e buffer. If thi
238c0 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  s allocation att
238d0 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20  empt .** fails, 
238e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
238f0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
23900 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69   page size remai
23910 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a  ns unchanged. .*
23920 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
23930 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ases, SQLITE_OK 
23940 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
23950 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
23960 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ize is not chang
23970 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75  ed, either becau
23980 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e  se one of the en
23990 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64  umerated.** cond
239a0 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20  itions above is 
239b0 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61  not true, the pa
239c0 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72  ger was in error
239d0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
239e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  .** function was
239f0 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61   called, or beca
23a00 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  use the memory a
23a10 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
23a20 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68  t failed, .** th
23a30 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73  en *pPageSize is
23a40 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c   set to the old,
23a50 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73   retained page s
23a60 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ize before retur
23a70 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
23a80 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
23a90 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
23aa0 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69  er, u32 *pPageSi
23ab0 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
23ac0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
23ad0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
23ae0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
23af0 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61  e to do a full a
23b00 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
23b10 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69  e() here, as thi
23b20 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
23b30 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72  may be called fr
23b40 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f  om within PagerO
23b50 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68  pen(), before th
23b60 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20  e state.  ** of 
23b70 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
23b80 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63   is internally c
23b90 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a  onsistent..  **.
23ba0 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    ** At one poin
23bb0 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
23bc0 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
23bd0 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77  r if the pager w
23be0 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45  as in .  ** PAGE
23bf0 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42  R_ERROR state. B
23c00 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45  ut since PAGER_E
23c10 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61  RROR state guara
23c20 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  ntees that.  ** 
23c30 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73  there is at leas
23c40 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
23c50 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
23c60 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
23c70 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20    ** is a no-op 
23c80 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e  for that case an
23c90 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33  yhow..  */..  u3
23ca0 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50  2 pageSize = *pP
23cb0 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
23cc0 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c  t( pageSize==0 |
23cd0 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  | (pageSize>=512
23ce0 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
23cf0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
23d00 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50  ZE) );.  if( (pP
23d10 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c  ager->memDb==0 |
23d20 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
23d30 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74  ==0).   && sqlit
23d40 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
23d50 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
23d60 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65  )==0 .   && page
23d70 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
23d80 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  !=(u32)pPager->p
23d90 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20  ageSize .  ){.  
23da0 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e    char *pNew = N
23db0 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ULL;            
23dc0 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61   /* New temp spa
23dd0 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42  ce */.    i64 nB
23de0 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  yte = 0;..    if
23df0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
23e00 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69  >PAGER_OPEN && i
23e10 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
23e20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
23e30 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
23e40 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
23e50 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Byte);.    }.   
23e60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23e70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  OK ){.      pNew
23e80 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
23e90 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67  e3PageMalloc(pag
23ea0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
23eb0 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53  ( !pNew ) rc = S
23ec0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
23ed0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
23ee0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23ef0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
23f00 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
23f10 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
23f20 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67  SetPageSize(pPag
23f30 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
23f40 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
23f50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23f60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
23f70 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
23f80 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
23f90 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
23fa0 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
23fb0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
23fc0 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28  bSize = (Pgno)((
23fd0 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65 2d 31  nByte+pageSize-1
23fe0 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  )/pageSize);.   
23ff0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
24000 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
24010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24020 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
24030 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20  (pNew);.    }.  
24040 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20  }..  *pPageSize 
24050 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
24060 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ze;.  if( rc==SQ
24070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
24080 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20  f( nReserve<0 ) 
24090 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65  nReserve = pPage
240a0 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  r->nReserve;.   
240b0 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
240c0 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
240d0 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61  <1000 );.    pPa
240e0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
240f0 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (i16)nReserve;. 
24100 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
24110 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
24120 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74  pagerFixMaplimit
24130 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
24140 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24150 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
24160 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d  nter to the "tem
24170 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66  porary page" buf
24180 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61  fer held interna
24190 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61  lly.** by the pa
241a0 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20  ger.  This is a 
241b0 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62  buffer that is b
241c0 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
241d0 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  d the.** entire 
241e0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74  content of a dat
241f0 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69  abase page.  Thi
24200 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  s buffer is used
24210 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64   internally.** d
24220 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61  uring rollback a
24230 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
24240 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20  ritten whenever 
24250 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
24260 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72  curs.  But other
24270 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65   modules are fre
24280 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c  e to use it too,
24290 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e   as long as.** n
242a0 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20  o rollbacks are 
242b0 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  happening..*/.vo
242c0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
242d0 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20  TempSpace(Pager 
242e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
242f0 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  rn pPager->pTmpS
24300 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pace;.}../*.** A
24310 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
24320 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
24330 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
24340 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
24350 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
24360 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
24370 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
24380 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
24390 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
243a0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
243b0 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
243c0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
243d0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
243e0 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
243f0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
24400 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
24410 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
24420 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
24430 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
24440 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
24450 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
24460 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
24470 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
24480 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
24490 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
244a0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
244b0 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61  EN );      /* Ca
244c0 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f  lled only by OP_
244d0 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73  MaxPgcnt */.  as
244e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78  sert( pPager->mx
244f0 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62  Pgno>=pPager->db
24500 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d  Size );  /* OP_M
24510 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73  axPgcnt enforces
24520 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72   this */.  retur
24530 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
24540 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
24550 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
24560 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
24570 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
24580 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
24590 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
245a0 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
245b0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
245c0 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
245d0 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
245e0 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
245f0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
24600 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
24610 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
24620 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
24630 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
24640 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
24650 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
24660 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
24670 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
24680 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
24690 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
246a0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
246b0 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
246c0 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
246d0 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
246e0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
246f0 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
24700 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
24710 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
24720 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
24730 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
24740 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
24750 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
24760 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
24770 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24780 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
24790 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
247a0 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
247b0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
247c0 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
247d0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
247e0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
247f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
24800 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
24810 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
24820 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
24830 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
24840 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
24850 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74   to. .**.** If t
24860 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65  he pager was ope
24870 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65  ned on a transie
24880 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61  nt file (zFilena
24890 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f  me==""), or.** o
248a0 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20  pened on a file 
248b0 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65  less than N byte
248c0 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f  s in size, the o
248d0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a  utput buffer is.
248e0 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51  ** zeroed and SQ
248f0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
24900 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20  . The rationale 
24910 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
24920 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
24930 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
24940 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64  ad database head
24950 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74  ers, and a new t
24960 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a  ransient or.** z
24970 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61  ero sized databa
24980 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20  se has a header 
24990 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e  than consists en
249a0 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73  tirely of zeroes
249b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49  ..**.** If any I
249c0 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72  O error apart fr
249d0 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  om SQLITE_IOERR_
249e0 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e  SHORT_READ is en
249f0 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68  countered,.** th
24a00 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
24a10 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
24a20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63  caller and the c
24a30 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
24a40 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  * output buffer 
24a50 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e  undefined..*/.in
24a60 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
24a70 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67  adFileheader(Pag
24a80 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
24a90 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
24aa0 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20   *pDest){.  int 
24ab0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24ac0 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
24ad0 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28  0, N);.  assert(
24ae0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
24af0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
24b00 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  empFile );..  /*
24b10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
24b20 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
24b30 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c  btree immediatel
24b40 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67  y after creating
24b50 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20  .  ** the Pager 
24b60 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68  object.  There h
24b70 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f  as not been an o
24b80 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72  pportunity to tr
24b90 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f  ansition.  ** to
24ba0 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20   WAL mode yet.. 
24bb0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
24bc0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
24bd0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f  r) );..  if( isO
24be0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
24bf0 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
24c00 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
24c10 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
24c20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24c30 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
24c40 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
24c50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24c60 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
24c70 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
24c80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
24c90 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
24ca0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
24cb0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f  s function may o
24cc0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  nly be called wh
24cd0 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
24ce0 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e  ction is open on
24cf0 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49  .** the pager. I
24d00 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  t returns the to
24d10 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
24d20 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
24d30 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76  ase..**.** Howev
24d40 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20  er, if the file 
24d50 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  is between 1 and
24d60 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74   <page-size> byt
24d70 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e  es in size, then
24d80 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e   .** this is con
24d90 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65  sidered a 1 page
24da0 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
24db0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
24dc0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
24dd0 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29  er, int *pnPage)
24de0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
24df0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
24e00 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
24e10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
24e20 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54  tate!=PAGER_WRIT
24e30 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20  ER_FINISHED );. 
24e40 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29   *pnPage = (int)
24e50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
24e60 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
24e70 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
24e80 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20  f type locktype 
24e90 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
24ea0 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69  file. If.** a si
24eb0 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72  milar or greater
24ec0 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
24ed0 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
24ee0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a  tion is a no-op.
24ef0 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51  ** (returning SQ
24f00 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74  LITE_OK immediat
24f10 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ely)..**.** Othe
24f20 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74  rwise, attempt t
24f30 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  o obtain the loc
24f40 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  k using sqlite3O
24f50 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20  sLock(). Invoke 
24f60 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c  .** the busy cal
24f70 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
24f80 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  k is currently n
24f90 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65  ot available. Re
24fa0 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74  peat .** until t
24fb0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
24fc0 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f   returns false o
24fd0 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65  r until the atte
24fe0 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69  mpt to .** obtai
24ff0 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  n the lock succe
25000 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
25010 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
25020 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
25030 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
25040 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
25050 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  the lock. If the
25060 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
25070 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
25080 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74  set the Pager.st
25090 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ate .** variable
250a0 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66   to locktype bef
250b0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
250c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
250d0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
250e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
250f0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
25100 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
25110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25120 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
25130 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ode */..  /* Che
25140 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ck that this is 
25150 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28  either a no-op (
25160 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75  because the requ
25170 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20  ested lock is . 
25180 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64   ** already held
25190 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  ), or one of the
251a0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 68 61   transitions tha
251b0 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  t the busy-handl
251c0 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  er.  ** may be i
251d0 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61  nvoked during, a
251e0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
251f0 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20  comment above.  
25200 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ** sqlite3PagerS
25210 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e  etBusyhandler().
25220 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
25230 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d  (pPager->eLock>=
25240 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20  locktype).      
25250 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
25260 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c  ck==NO_LOCK && l
25270 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
25280 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20  LOCK).       || 
25290 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
252a0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
252b0 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
252c0 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a  SIVE_LOCK).  );.
252d0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
252e0 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
252f0 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  ger, locktype);.
25300 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
25310 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61  LITE_BUSY && pPa
25320 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
25330 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
25340 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20  andlerArg) );.  
25350 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25360 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73  .** Function ass
25370 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25380 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68  raint(pPager) ch
25390 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  ecks that one of
253a0 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69   the .** followi
253b0 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61  ng is true for a
253c0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63  ll dirty pages c
253d0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
253e0 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a  page-cache:.**.*
253f0 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20  *   a) The page 
25400 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
25410 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
25420 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
25430 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74  .**      current
25440 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
25450 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a   in pages, OR.**
25460 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20  .**   b) if the 
25470 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72  page content wer
25480 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69  e written at thi
25490 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64  s time, it would
254a0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20   not.**      be 
254b0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
254c0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  te the current c
254d0 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68  ontent out to th
254e0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
254f0 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d        (as determ
25500 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e  ined by function
25510 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
25520 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  e())..**.** If t
25530 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73  he condition ass
25540 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75  erted by this fu
25550 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20  nction were not 
25560 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a  true, and the.**
25570 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65   dirty page were
25580 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64   to be discarded
25590 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
255a0 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72  via the pagerStr
255b0 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ess().** routine
255c0 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  , pagerStress() 
255d0 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20  would not write 
255e0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
255f0 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74   content to.** t
25600 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25610 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74  . If a savepoint
25620 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72   transaction wer
25630 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66  e rolled back af
25640 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70  ter.** this happ
25650 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63  ened, the correc
25660 74 20 62 65 68 61 76 69 6f 72 20 77 6f 75 6c 64  t behavior would
25670 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74   be to restore t
25680 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f  he current.** co
25690 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
256a0 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63  e. However, sinc
256b0 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69  e this content i
256c0 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  s not present in
256d0 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64   either.** the d
256e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20  atabase file or 
256f0 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  the portion of t
25700 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
25710 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d  nal and .** sub-
25720 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62  journal rolled b
25730 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ack the content 
25740 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73  could not be res
25750 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  tored and the.**
25760 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
25770 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  would become cor
25780 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72  rupt. It is ther
25790 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20  efore fortunate 
257a0 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69  that .** this ci
257b0 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f  rcumstance canno
257c0 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20  t arise..*/.#if 
257d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
257e0 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).static voi
257f0 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
25800 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48  ConstraintCb(PgH
25810 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  dr *pPg){.  asse
25820 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
25830 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
25840 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71  assert( !subjReq
25850 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c  uiresPage(pPg) |
25860 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67  | pPg->pgno<=pPg
25870 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ->pPager->dbSize
25880 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   );.}.static voi
25890 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
258a0 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72  Constraint(Pager
258b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
258c0 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
258d0 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
258e0 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72  PCache, assertTr
258f0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25900 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Cb);.}.#else.# d
25910 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e  efine assertTrun
25920 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
25930 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f  Pager).#endif../
25940 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
25950 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
25960 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
25970 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  to nPage pages. 
25980 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
25990 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61  n does not actua
259a0 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64  lly modify the d
259b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
259c0 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73  disk. It .** jus
259d0 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  t sets the inter
259e0 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
259f0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f   pager object so
25a00 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72   that the .** tr
25a10 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  uncation will be
25a20 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63   done when the c
25a30 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
25a40 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
25a50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
25a60 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
25a70 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65  led right before
25a80 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
25a90 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f 6e  ansaction..** On
25aa0 63 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ce this function
25ab0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
25ac0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
25ad0 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20 62 65  n must either be
25ae0 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
25af0 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 74  or committed. It
25b00 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
25b10 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
25b20 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20 63  on and.** then c
25b30 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e 67 20  ontinue writing 
25b40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
25b50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25b60 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
25b70 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
25b80 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
25b90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25ba0 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29  >dbSize>=nPage )
25bb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
25bc0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
25bd0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
25be0 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  D );.  pPager->d
25bf0 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 0a  bSize = nPage;..
25c00 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    /* At one poin
25c10 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  t the code here 
25c20 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54 72 75  called assertTru
25c30 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
25c40 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65  ) to.  ** ensure
25c50 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
25c60 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64 20  being truncated 
25c70 61 77 61 79 20 62 79 20 74 68 69 73 20 6f 70 65  away by this ope
25c80 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a 2a  ration are,.  **
25c90 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
25ca0 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 6f  savepoints are o
25cb0 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e 20  pen, present in 
25cc0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
25cd0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20 74   ** journal so t
25ce0 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20  hat they can be 
25cf0 72 65 73 74 6f 72 65 64 20 69 66 20 74 68 65 20  restored if the 
25d00 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72 6f 6c  savepoint is rol
25d10 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 54  led.  ** back. T
25d20 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  his is no longer
25d30 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
25d40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
25d50 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61 6c  ow only.  ** cal
25d60 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72 65  led right before
25d70 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
25d80 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61 6c  ansaction. So al
25d90 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20 2a 2a  though the .  **
25da0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 6d 61   Pager object ma
25db0 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f 70 65  y still have ope
25dc0 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28 50 61  n savepoints (Pa
25dd0 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21 3d  ger.nSavepoint!=
25de0 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20 63  0), .  ** they c
25df0 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
25e00 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61 73 73  back. So the ass
25e10 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25e20 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20 2a  raint() call.  *
25e30 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63  * is no longer c
25e40 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a 2f  orrect. */.}.../
25e50 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
25e60 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
25e70 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
25e80 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
25e90 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e  lback. It.** syn
25ea0 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  cs the journal f
25eb0 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65  ile to disk, the
25ec0 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a  n sets pPager->j
25ed0 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65  ournalHdr to the
25ee0 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
25ef0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20  journal file so 
25f00 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70  that the pager_p
25f10 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
25f20 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20  e knows.** that 
25f30 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
25f40 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  al file has been
25f50 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53   synced..**.** S
25f60 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  yncing a hot-jou
25f70 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66  rnal to disk bef
25f80 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ore attempting t
25f90 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65  o roll it back e
25fa0 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20  nsures .** that 
25fb0 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75  if a power-failu
25fc0 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  re occurs during
25fd0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74   the rollback, t
25fe0 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a  he process that.
25ff0 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c  ** attempts roll
26000 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73  back following s
26010 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73  ystem recovery s
26020 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75  ees the same jou
26030 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rnal.** content 
26040 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  as this process.
26050 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
26060 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61  hing goes as pla
26070 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  nned, SQLITE_OK 
26080 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
26090 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53  erwise, .** an S
260a0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
260b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
260c0 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
260d0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
260e0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
260f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
26100 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
26110 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
26120 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
26130 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59  ->jfd, SQLITE_SY
26140 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a  NC_NORMAL);.  }.
26150 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26160 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
26170 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
26180 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
26190 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
261a0 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  dr);.  }.  retur
261b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
261c0 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  btain a referenc
261d0 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61  e to a memory ma
261e0 70 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74  pped page object
261f0 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
26200 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e   pgno. .** The n
26210 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75  ew object will u
26220 73 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  se the pointer p
26230 44 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66  Data, obtained f
26240 72 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a  rom xFetch()..**
26250 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
26260 73 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70  set *ppPage to p
26270 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
26280 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a  page reference.*
26290 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  * and return SQL
262a0 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
262b0 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  e, return an SQL
262c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61  ite error code a
262d0 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67  nd set.** *ppPag
262e0 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  e to zero..**.**
262f0 20 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   Page references
26300 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c   obtained by cal
26310 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
26320 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c  on should be rel
26330 65 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c  eased.** by call
26340 69 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73 65  ing pagerRelease
26350 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  MapPage()..*/.st
26360 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63  atic int pagerAc
26370 71 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20  quireMapPage(.  
26380 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
26390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263a0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
263b0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
263c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263d0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
263e0 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ber */.  void *p
263f0 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
26400 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
26410 63 68 28 29 27 64 20 64 61 74 61 20 66 6f 72 20  ch()'d data for 
26420 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
26430 67 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20  gHdr **ppPage   
26440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26450 2a 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20  * OUT: Acquired 
26460 70 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  page object */.)
26470 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
26480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26490 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
264a0 70 70 65 64 20 70 61 67 65 20 74 6f 20 72 65 74  pped page to ret
264b0 75 72 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20  urn */.  .  if( 
264c0 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
264d0 65 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70  elist ){.    *pp
264e0 50 61 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65  Page = p = pPage
264f0 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
26500 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d  ;.    pPager->pM
26510 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d  mapFreelist = p-
26520 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e  >pDirty;.    p->
26530 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
26540 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61  memset(p->pExtra
26550 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
26560 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tra);.  }else{. 
26570 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d     *ppPage = p =
26580 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69 74 65   (PgHdr *)sqlite
26590 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
265a0 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50 61 67  of(PgHdr) + pPag
265b0 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
265c0 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
265d0 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65     sqlite3OsUnfe
265e0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
265f0 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20  (i64)(pgno-1) * 
26600 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
26610 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , pData);.      
26620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
26630 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
26640 2d 3e 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64  ->pExtra = (void
26650 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d   *)&p[1];.    p-
26660 3e 66 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d  >flags = PGHDR_M
26670 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66  MAP;.    p->nRef
26680 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61   = 1;.    p->pPa
26690 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
266a0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  }..  assert( p->
266b0 70 45 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29  pExtra==(void *)
266c0 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72  &p[1] );.  asser
266d0 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29  t( p->pPage==0 )
266e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66  ;.  assert( p->f
266f0 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50  lags==PGHDR_MMAP
26700 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
26710 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
26720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
26730 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d  nRef==1 );..  p-
26740 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
26750 70 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61  p->pData = pData
26760 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  ;.  pPager->nMma
26770 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72  pOut++;..  retur
26780 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26790 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
267a0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
267b0 65 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20  e pPg. pPg must 
267c0 68 61 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e  have been return
267d0 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72  ed by an .** ear
267e0 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67  lier call to pag
267f0 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65  erAcquireMapPage
26800 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
26810 69 64 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d  id pagerReleaseM
26820 61 70 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  apPage(PgHdr *pP
26830 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
26840 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
26850 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d  r;.  pPager->nMm
26860 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e  apOut--;.  pPg->
26870 70 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d  pDirty = pPager-
26880 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a  >pMmapFreelist;.
26890 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46    pPager->pMmapF
268a0 72 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a  reelist = pPg;..
268b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
268c0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  ->fd->pMethods->
268d0 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20  iVersion>=3 );. 
268e0 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
268f0 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69  h(pPager->fd, (i
26900 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  64)(pPg->pgno-1)
26910 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
26920 65 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a  e, pPg->pData);.
26930 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
26940 6c 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20  l PgHdr objects 
26950 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61  stored in the Pa
26960 67 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73  ger.pMmapFreelis
26970 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  t list..*/.stati
26980 63 20 76 6f 69 64 20 70 61 67 65 72 46 72 65 65  c void pagerFree
26990 4d 61 70 48 64 72 73 28 50 61 67 65 72 20 2a 70  MapHdrs(Pager *p
269a0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
269b0 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65  *p;.  PgHdr *pNe
269c0 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67  xt;.  for(p=pPag
269d0 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
269e0 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a  t; p; p=pNext){.
269f0 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
26a00 44 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74  Dirty;.    sqlit
26a10 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
26a20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  }.../*.** Shutdo
26a30 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  wn the page cach
26a40 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  e.  Free all mem
26a50 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c  ory and close al
26a60 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
26a70 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
26a80 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  was in progress 
26a90 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
26aa0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61  e is called, tha
26ab0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
26ac0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
26ad0 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e    All outstandin
26ae0 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
26af0 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74  lidated.** and t
26b00 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66  heir memory is f
26b10 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d  reed.  Any attem
26b20 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65  pt to use a page
26b30 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
26b40 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61  ith this page ca
26b50 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66  che after this f
26b60 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
26b70 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
26b80 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
26b90 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ump..**.** This 
26ba0 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
26bb0 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74  succeeds. If a t
26bc0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
26bd0 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a  tive an attempt.
26be0 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f  ** is made to ro
26bf0 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61  ll it back. If a
26c00 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
26c10 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
26c20 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75  ck .** a hot jou
26c30 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74  rnal may be left
26c40 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   in the filesyst
26c50 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  em but no error 
26c60 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74  is returned.** t
26c70 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
26c80 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
26c90 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  rClose(Pager *pP
26ca0 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d  ager){.  u8 *pTm
26cb0 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72  p = (u8 *)pPager
26cc0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20  ->pTmpSpace;..  
26cd0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
26ce0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
26cf0 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f  r) );.  disable_
26d00 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
26d10 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  ors();.  sqlite3
26d20 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
26d30 63 28 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65  c();.  pagerFree
26d40 4d 61 70 48 64 72 73 28 70 50 61 67 65 72 29 3b  MapHdrs(pPager);
26d50 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
26d60 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  rCode = 0; */.  
26d70 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
26d80 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eMode = 0;.#ifnd
26d90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
26da0 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43  AL.  sqlite3WalC
26db0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61  lose(pPager->pWa
26dc0 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  l, pPager->ckptS
26dd0 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72  yncFlags, pPager
26de0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70  ->pageSize, pTmp
26df0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61  );.  pPager->pWa
26e00 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  l = 0;.#endif.  
26e10 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
26e20 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  er);.  if( MEMDB
26e30 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   ){.    pager_un
26e40 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
26e50 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
26e60 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e   it is open, syn
26e70 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
26e80 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
26e90 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  g UnlockAndRollb
26ea0 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  ack..    ** If t
26eb0 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c  his is not done,
26ec0 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65   then an unsynce
26ed0 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
26ee0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20   open journal . 
26ef0 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62     ** file may b
26f00 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e  e played back in
26f10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
26f20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
26f30 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20  ure occurs .    
26f40 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73  ** while this is
26f50 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20   happening, the 
26f60 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
26f70 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20  ecome corrupt.. 
26f80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
26f90 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
26fa0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
26fb0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
26fc0 2c 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65  , shift the page
26fd0 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  r.    ** into th
26fe0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54  e ERROR state. T
26ff0 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63  his causes Unloc
27000 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20  kAndRollback to 
27010 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a  unlock the.    *
27020 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  * database and c
27030 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
27040 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74   file without at
27050 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
27060 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20   it.    ** back 
27070 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20  or finalize it. 
27080 54 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73  The next databas
27090 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65  e user will have
270a0 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e   to do hot-journ
270b0 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  al.    ** rollba
270c0 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73  ck before access
270d0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
270e0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
270f0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
27100 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
27110 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
27120 50 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63  Pager, pagerSync
27130 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
27140 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
27150 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
27160 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
27170 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
27180 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
27190 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
271a0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
271b0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c   PAGERTRACE(("CL
271c0 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
271d0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
271e0 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  IOTRACE(("CLOSE 
271f0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
27200 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
27210 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
27220 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
27230 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73  pPager->fd);.  s
27240 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
27250 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  Tmp);.  sqlite3P
27260 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65  cacheClose(pPage
27270 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69  r->pPCache);..#i
27280 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
27290 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67  CODEC.  if( pPag
272a0 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29  er->xCodecFree )
272b0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
272c0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  ree(pPager->pCod
272d0 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ec);.#endif..  a
272e0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
272f0 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  aSavepoint && !p
27300 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
27310 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  l );.  assert( !
27320 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27330 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70  fd) && !isOpen(p
27340 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a  Pager->sjfd) );.
27350 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
27360 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
27370 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
27380 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
27390 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
273a0 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
273b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
273c0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61  ge number for pa
273d0 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20  ge pPg..*/.Pgno 
273e0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
273f0 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70  number(DbPage *p
27400 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
27410 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69  g->pgno;.}.#endi
27420 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
27430 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
27440 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20   count for page 
27450 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  pPg..*/.void sql
27460 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50  ite3PagerRef(DbP
27470 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c  age *pPg){.  sql
27480 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50  ite3PcacheRef(pP
27490 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  g);.}../*.** Syn
274a0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49  c the journal. I
274b0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
274c0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
274d0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
274e0 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
274f0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
27500 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
27510 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
27520 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
27530 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74   and can be rest
27540 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ored in the even
27550 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t of a hot-journ
27560 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  al rollback..**.
27570 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  ** If the Pager.
27580 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  noSync flag is s
27590 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  et, then this fu
275a0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
275b0 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  p..** Otherwise,
275c0 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71   the actions req
275d0 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20  uired depend on 
275e0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
275f0 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76   and the .** dev
27600 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
27610 69 63 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2d  ics of the file-
27620 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f  system, as follo
27630 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
27640 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27650 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  e is an in-memor
27660 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  y journal file, 
27670 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a  no action need.*
27680 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a  *     be taken..
27690 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77  **.**   * Otherw
276a0 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69  ise, if the devi
276b0 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
276c0 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50  ort the SAFE_APP
276d0 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a  END property,.**
276e0 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52       then the nR
276f0 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ec field of the 
27700 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72  most recently wr
27710 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65  itten journal he
27720 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75  ader.**     is u
27730 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69  pdated to contai
27740 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
27750 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
27760 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  that have.**    
27770 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f   been written fo
27780 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74  llowing it. If t
27790 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72  he pager is oper
277a0 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79  ating in full-sy
277b0 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20  nc.**     mode, 
277c0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
277d0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
277e0 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c  before this fiel
277f0 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a  d is updated..**
27800 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64  .**   * If the d
27810 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
27820 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45  upport the SEQUE
27830 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20  NTIAL property, 
27840 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75  then .**     jou
27850 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
27860 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ced..**.** Or, i
27870 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a  n pseudo-code:.*
27880 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c  *.**   if( NOT <
27890 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
278a0 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28  l> ){.**     if(
278b0 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44   NOT SAFE_APPEND
278c0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
278d0 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65   <full-sync mode
278e0 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  > ) xSync(<journ
278f0 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
27900 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63      <update nRec
27910 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d   field>.**     }
27920 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54   .**     if( NOT
27930 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53   SEQUENTIAL ) xS
27940 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
27950 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  e>);.**   }.**.*
27960 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
27970 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   this routine cl
27980 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e  ears the PGHDR_N
27990 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66  EED_SYNC flag of
279a0 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20   every .** page 
279b0 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69  currently held i
279c0 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20  n memory before 
279d0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
279e0 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a  _OK. If an IO.**
279f0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
27a00 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  tered, then the 
27a10 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
27a20 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
27a30 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
27a40 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
27a50 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
27a60 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20  , int newHdr){. 
27a70 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
27a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a90 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
27aa0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
27ab0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
27ac0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
27ad0 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
27ae0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
27af0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
27b00 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
27b10 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
27b20 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
27b30 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
27b40 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
27b50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
27b60 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
27b70 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
27b80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27b90 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
27ba0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
27bb0 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
27bc0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
27bd0 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
27be0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27bf0 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  d) && pPager->jo
27c00 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
27c10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
27c20 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ORY ){.      con
27c30 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c  st int iDc = sql
27c40 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
27c50 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
27c60 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
27c70 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
27c80 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
27c90 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
27ca0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
27cb0 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
27cc0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
27cd0 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61  ock deals with a
27ce0 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65  n obscure proble
27cf0 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63  m. If the last c
27d00 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20  onnection.      
27d10 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20    ** that wrote 
27d20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
27d30 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69   was operating i
27d40 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75  n persistent-jou
27d50 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
27d60 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
27d70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
27d80 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63  at this point ac
27d90 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72  tually be larger
27da0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e  .        ** than
27db0 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
27dc0 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20  f bytes. If the 
27dd0 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68  next thing in th
27de0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
27df0 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e    ** file happen
27e00 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61  s to be a journa
27e10 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65  l-header (writte
27e20 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  n as part of the
27e30 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
27e40 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27  ious connection'
27e50 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  s transaction), 
27e60 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70  and a crash or p
27e70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20  ower-failure .  
27e80 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20        ** occurs 
27e90 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70  after nRec is up
27ea0 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65  dated but before
27eb0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
27ec0 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20   writes .       
27ed0 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73   ** anything els
27ee0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
27ef0 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74   file (or commit
27f00 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73  s/rolls back its
27f10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61   .        ** tra
27f20 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20  nsaction), then 
27f30 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d  SQLite may becom
27f40 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20  e confused when 
27f50 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  doing the .     
27f60 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
27f70 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  l rollback follo
27f80 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49  wing recovery. I
27f90 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20  t may roll back 
27fa0 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  all.        ** o
27fb0 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
27fc0 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72  ns data, then pr
27fd0 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67  oceed to rolling
27fe0 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20   back the old,. 
27ff0 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66         ** out-of
28000 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20  -date data that 
28010 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61  follows it. Data
28020 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
28030 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
28040 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61      ** To work a
28050 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74  round this, if t
28060 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28070 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63  does appear to c
28080 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a  ontain.        *
28090 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72  * a valid header
280a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72   following Pager
280b0 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65  .journalOff, the
280c0 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20  n write a 0x00. 
280d0 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74         ** byte t
280e0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
280f0 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20  t to prevent it 
28100 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67  from being recog
28110 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  nized..        *
28120 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72  *.        ** Var
28130 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66  iable iNextHdrOf
28140 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74  fset is set to t
28150 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69  he offset at whi
28160 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  ch this.        
28170 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68  ** problematic h
28180 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72  eader will occur
28190 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  , if it exists. 
281a0 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a  aMagic is used .
281b0 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20          ** as a 
281c0 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
281d0 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20   to inspect the 
281e0 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20  first couple of 
281f0 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20  bytes of.       
28200 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61   ** the potentia
28210 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  l journal header
28220 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
28230 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64       i64 iNextHd
28240 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  rOffset;.       
28250 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20   u8 aMagic[8];. 
28260 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64 65         u8 zHeade
28270 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
28280 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20  lMagic)+4];..   
28290 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61       memcpy(zHea
282a0 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
282b0 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
282c0 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
282d0 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
282e0 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
282f0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70  ournalMagic)], p
28300 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20  Pager->nRec);.. 
28310 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f         iNextHdrO
28320 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48  ffset = journalH
28330 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
28340 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
28350 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
28360 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
28370 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 8, iNextHdrOff
28380 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  set);.        if
28390 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
283a0 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61  && 0==memcmp(aMa
283b0 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
283c0 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20  ic, 8) ){.      
283d0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
283e0 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30   u8 zerobyte = 0
283f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
28400 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
28410 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65  pPager->jfd, &ze
28420 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74  robyte, 1, iNext
28430 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
28440 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
28450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28460 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
28470 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
28480 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
28490 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
284a0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ..        /* Wri
284b0 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
284c0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
284d0 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
284e0 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
284f0 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
28500 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
28510 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
28520 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
28530 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
28540 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
28550 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
28560 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
28570 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
28580 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
28590 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
285a0 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  llback..        
285b0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
285c0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
285d0 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73  ed if the persis
285e0 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f  tent media suppo
285f0 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  rts the.        
28600 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  ** SAFE_APPEND p
28610 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65  roperty. Because
28620 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
28630 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
28640 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72   .        ** for
28650 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f   garbage data to
28660 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20   be appended to 
28670 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52  the file, the nR
28680 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20  ec field.       
28690 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64   ** is populated
286a0 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46   with 0xFFFFFFFF
286b0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
286c0 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l header is writ
286d0 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ten.        ** a
286e0 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  nd never needs t
286f0 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
28700 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28710 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
28720 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63  lSync && 0==(iDc
28730 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
28740 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
28750 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
28760 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
28770 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
28780 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
28790 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
287a0 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
287b0 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
287c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
287d0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
287e0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  , pPager->syncFl
287f0 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ags);.          
28800 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28810 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
28820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28830 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
28840 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67  %p %lld\n", pPag
28850 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
28860 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20  nalHdr));.      
28870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
28880 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20  Write(.         
28890 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20     pPager->jfd, 
288a0 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  zHeader, sizeof(
288b0 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72  zHeader), pPager
288c0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
288d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
288e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
288f0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
28900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
28910 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
28920 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
28930 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47  ) ){.        PAG
28940 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
28950 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
28960 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28970 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  ));.        IOTR
28980 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
28990 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
289a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
289b0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
289c0 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
289d0 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20  Flags| .        
289e0 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46    (pPager->syncF
289f0 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  lags==SQLITE_SYN
28a00 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59  C_FULL?SQLITE_SY
28a10 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20  NC_DATAONLY:0). 
28a20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
28a30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28a40 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
28a50 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
28a60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
28a70 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
28a80 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69  rnalOff;.      i
28a90 66 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d 3d  f( newHdr && 0==
28aa0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
28ab0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
28ac0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
28ad0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
28ae0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
28af0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
28b00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28b10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28b20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
28b30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28b40 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
28b50 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
28b60 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
28b70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73  .  }..  /* Unles
28b80 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
28b90 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74  n noSync mode, t
28ba0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28bb0 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73  was just .  ** s
28bc0 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63  uccessfully sync
28bd0 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ed. Either way, 
28be0 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
28bf0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
28c00 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65  n .  ** all page
28c10 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
28c20 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63  3PcacheClearSync
28c30 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50  Flags(pPager->pP
28c40 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65 72  Cache);.  pPager
28c50 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
28c60 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20  _WRITER_DBMOD;. 
28c70 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
28c80 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
28c90 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
28ca0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
28cb0 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
28cc0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e   is the first in
28cd0 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
28ce0 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f  f dirty pages co
28cf0 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68  nnected.** by th
28d00 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
28d10 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e  ointer. This fun
28d20 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63  ction writes eac
28d30 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  h one of the.** 
28d40 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
28d50 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74  in the list to t
28d60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28d70 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  . The argument m
28d80 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72  ay.** be NULL, r
28d90 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65  epresenting an e
28da0 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68  mpty list. In th
28db0 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e  is case this fun
28dc0 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f  ction is.** a no
28dd0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
28de0 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ager must hold a
28df0 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
28e00 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69  ED lock when thi
28e10 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
28e20 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20   called. Before 
28e30 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67  writing anything
28e40 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
28e50 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b   file, this lock
28e60 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64 20  .** is upgraded 
28e70 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
28e80 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63  lock. If the loc
28e90 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
28ea0 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ined,.** SQLITE_
28eb0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
28ec0 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20   and no data is 
28ed0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
28ee0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
28ef0 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65   .** If the page
28f00 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  r is a temp-file
28f10 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 61   pager and the a
28f20 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65  ctual file-syste
28f30 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74  m file.** is not
28f40 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   yet open, it is
28f50 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65   created and ope
28f60 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  ned before any d
28f70 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ata is .** writt
28f80 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  en out..**.** On
28f90 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  ce the lock has 
28fa0 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e  been upgraded an
28fb0 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c  d, if necessary,
28fc0 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
28fd0 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61  ,.** the pages a
28fe0 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  re written out t
28ff0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
29000 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65  ile in list orde
29010 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20  r. Writing.** a 
29020 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64 20  page is skipped 
29030 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74 68  if it meets eith
29040 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  er of the follow
29050 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a  ing criteria:.**
29060 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
29070 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
29080 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  er than Pager.db
29090 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  Size, or.**   * 
290a0 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  The PGHDR_DONT_W
290b0 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65 74  RITE flag is set
290c0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
290d0 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f  .** If writing o
290e0 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73  ut a page causes
290f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29100 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65  le to grow, Page
29110 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20  r.dbFileSize.** 
29120 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
29130 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20  dingly. If page 
29140 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74  1 is written out
29150 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
29160 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61   cached.** in Pa
29170 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
29180 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
29190 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c  atch the new val
291a0 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
291b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
291c0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  e..**.** If ever
291d0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
291e0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
291f0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
29200 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  an IO error .** 
29210 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72  occurs, an IO er
29220 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
29230 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65  rned. Or, if the
29240 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
29250 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74  cannot.** be obt
29260 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55  ained, SQLITE_BU
29270 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
29280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
29290 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
292a0 73 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  st(Pager *pPager
292b0 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b  , PgHdr *pList){
292c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
292d0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
292e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
292f0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
29300 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
29310 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72   only called for
29320 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72 73   rollback pagers
29330 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44   in WRITER_DBMOD
29340 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73   state. */.  ass
29350 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
29360 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  l(pPager) );.  a
29370 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
29380 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
29390 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61  TER_DBMOD );.  a
293a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
293b0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
293c0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  LOCK );..  /* If
293d0 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74   the file is a t
293e0 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74  emp-file has not
293f0 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
29400 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49  , open it now. I
29410 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f  t.  ** is not po
29420 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f  ssible for rc to
29430 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53   be other than S
29440 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73  QLITE_OK if this
29450 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20   branch.  ** is 
29460 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f  taken, as pager_
29470 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69  wait_on_lock() i
29480 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65  s a no-op for te
29490 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20  mp-files..  */. 
294a0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
294b0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
294c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
294d0 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d  tempFile && rc==
294e0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
294f0 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
29500 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
29510 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
29520 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  vfsFlags);.  }..
29530 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20    /* Before the 
29540 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76  first write, giv
29550 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74  e the VFS a hint
29560 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e   of what the fin
29570 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a  al.  ** file siz
29580 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a  e will be..  */.
29590 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
295a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
295b0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
295c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
295d0 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67  E_OK .   && pPag
295e0 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70  er->dbHintSize<p
295f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20  Pager->dbSize.  
29600 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72   && (pList->pDir
29610 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e  ty || pList->pgn
29620 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  o>pPager->dbHint
29630 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73  Size).  ){.    s
29640 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46  qlite3_int64 szF
29650 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ile = pPager->pa
29660 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65  geSize * (sqlite
29670 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e  3_int64)pPager->
29680 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69  dbSize;.    sqli
29690 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
296a0 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
296b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
296c0 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65  ZE_HINT, &szFile
296d0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
296e0 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67  bHintSize = pPag
296f0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a  er->dbSize;.  }.
29700 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
29710 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
29720 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
29730 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b  o = pList->pgno;
29740 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
29750 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
29760 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
29770 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
29780 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
29790 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
297a0 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
297b0 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
297c0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77  runcateImage() w
297d0 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
297e0 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
297f0 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
29800 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
29810 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
29820 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
29830 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
29840 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
29850 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  **.    ** Also, 
29860 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74  do not write out
29870 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68   any page that h
29880 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e  as the PGHDR_DON
29890 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20  T_WRITE flag.   
298a0 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20   ** set (set by 
298b0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
298c0 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f  Write())..    */
298d0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
298e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
298f0 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67   0==(pList->flag
29900 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  s&PGHDR_DONT_WRI
29910 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34  TE) ){.      i64
29920 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
29930 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
29940 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f  pageSize;   /* O
29950 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a  ffset to write *
29960 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  /.      char *pD
29970 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29990 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74         /* Data t
299a0 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a  o write */    ..
299b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
299c0 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
299d0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20  R_NEED_SYNC)==0 
299e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
299f0 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61  st->pgno==1 ) pa
29a00 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
29a10 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a  counter(pList);.
29a20 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
29a30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
29a40 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
29a50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
29a60 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
29a70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
29a80 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
29a90 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
29aa0 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
29ab0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29ac0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
29ad0 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
29ae0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
29af0 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
29b00 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
29b10 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
29b20 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
29b30 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
29b40 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
29b50 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
29b60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29b70 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
29b80 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
29b90 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
29ba0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
29bb0 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
29bc0 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
29bd0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
29be0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
29bf0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
29c00 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
29c10 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
29c20 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
29c30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
29c40 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
29c50 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
29c60 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
29c70 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
29c80 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
29c90 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
29ca0 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
29cb0 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ++;..      /* Up
29cc0 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20  date any backup 
29cd0 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20  objects copying 
29ce0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
29cf0 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20  this pager. */. 
29d00 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
29d10 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
29d20 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
29d30 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74  (u8*)pList->pDat
29d40 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52  a);..      PAGER
29d50 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64  TRACE(("STORE %d
29d60 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
29d70 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
29d80 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
29d90 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
29da0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
29db0 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20  (pList)));.     
29dc0 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
29dd0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
29de0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  r, pgno));.     
29df0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
29e00 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
29e10 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65  b_count);.    }e
29e20 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
29e30 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20  TRACE(("NOSTORE 
29e40 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
29e50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
29e60 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
29e70 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
29e80 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20  hash(pList);.   
29e90 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
29ea0 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72  pDirty;.  }..  r
29eb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
29ec0 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  ** Ensure that t
29ed0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
29ee0 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20  ile is open. If 
29ef0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
29f00 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  en, this .** fun
29f10 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
29f20 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29f30 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29f40 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
29f50 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
29f60 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54  an. An .** SQLIT
29f70 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
29f80 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
29f90 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ed if a call to 
29fa0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20  sqlite3OsOpen() 
29fb0 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  .** fails..*/.st
29fc0 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62  atic int openSub
29fd0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
29fe0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
29ff0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a000 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2a010 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
2a020 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
2a030 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
2a040 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2a050 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  RY || pPager->su
2a060 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20  bjInMemory ){.  
2a070 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
2a080 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
2a090 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  ->sjfd);.    }el
2a0a0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
2a0b0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
2a0c0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66  ger, pPager->sjf
2a0d0 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  d, SQLITE_OPEN_S
2a0e0 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  UBJOURNAL);.    
2a0f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2a100 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  c;.}../*.** Appe
2a110 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74  nd a record of t
2a120 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
2a130 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20   of page pPg to 
2a140 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
2a150 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
2a160 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
2a170 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
2a180 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
2a190 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
2a1a0 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
2a1b0 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
2a1c0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
2a1d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
2a1e0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
2a1f0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
2a200 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
2a210 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
2a220 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
2a230 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
2a240 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
2a250 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
2a260 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
2a270 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
2a280 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
2a290 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
2a2a0 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
2a2b0 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
2a2c0 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
2a2d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a2e0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
2a2f0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
2a300 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ager;.  if( pPag
2a310 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
2a320 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2a330 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f  DE_OFF ){..    /
2a340 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
2a350 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61  ournal, if it ha
2a360 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
2a370 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20  en opened */.   
2a380 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a390 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
2a3a0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
2a3b0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
2a3c0 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
2a3d0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73  ager) );.    ass
2a3e0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2a3f0 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61  er->sjfd) || pPa
2a400 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20  ger->nSubRec==0 
2a410 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2a420 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2a430 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  r) .         || 
2a440 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
2a450 61 67 65 72 2c 20 70 50 67 29 20 0a 20 20 20 20  ager, pPg) .    
2a460 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e       || pPg->pgn
2a470 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
2a480 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20  Size .    );.   
2a490 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75   rc = openSubJou
2a4a0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20  rnal(pPager);.. 
2a4b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
2a4c0 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65  -journal was ope
2a4d0 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
2a4e0 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79   (or was already
2a4f0 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77   open),.    ** w
2a500 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rite the journal
2a510 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2a520 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69   file.  */.    i
2a530 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a540 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   ){.      void *
2a550 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
2a560 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66  ta;.      i64 of
2a570 66 73 65 74 20 3d 20 28 69 36 34 29 70 50 61 67  fset = (i64)pPag
2a580 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70  er->nSubRec*(4+p
2a590 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
2a5a0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  ;.      char *pD
2a5b0 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43  ata2;.  .      C
2a5c0 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
2a5d0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
2a5e0 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
2a5f0 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b  _NOMEM, pData2);
2a600 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
2a610 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
2a620 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2a630 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2a640 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
2a650 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
2a660 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
2a670 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
2a680 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
2a690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a6a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2a6b0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2a6c0 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
2a6d0 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
2a6e0 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
2a6f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a700 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2a710 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
2a720 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
2a730 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a740 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
2a750 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
2a760 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
2a770 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
2a780 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  >pgno);.  }.  re
2a790 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
2a7a0 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
2a7b0 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28 50  PageIfRequired(P
2a7c0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
2a7d0 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
2a7e0 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72  ge(pPg) ){.    r
2a7f0 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61 6c  eturn subjournal
2a800 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c  Page(pPg);.  }el
2a810 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
2a820 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
2a830 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2a840 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
2a850 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
2a860 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
2a870 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
2a880 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
2a890 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
2a8a0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
2a8b0 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a  r to a Pager obj
2a8c0 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20  ect.** (cast as 
2a8d0 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61  a void*). The pa
2a8e0 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70  ger is always 'p
2a8f0 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61  urgeable' (not a
2a900 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
2a910 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65  atabase). The se
2a920 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
2a930 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2a940 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a  a page that is .
2a950 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  ** currently dir
2a960 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75  ty but has no ou
2a970 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2a980 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a  nces. The page.*
2a990 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f  * is always asso
2a9a0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2a9b0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73  Pager object pas
2a9c0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
2a9d0 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   .** argument..*
2a9e0 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
2a9f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2aa00 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65   to make pPg cle
2aa10 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74  an by writing it
2aa20 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75  s contents.** ou
2aa30 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2aa40 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69  e file, if possi
2aa50 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e  ble. This may in
2aa60 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68  volve syncing th
2aa70 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
2aa80 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  e. .**.** If suc
2aa90 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33  cessful, sqlite3
2aaa0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2aab0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
2aac0 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53  he page and.** S
2aad0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2aae0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
2aaf0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
2ab00 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68  rying to make th
2ab10 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c  e.** page clean,
2ab20 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
2ab30 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
2ab40 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e  If the page cann
2ab50 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c  ot be.** made cl
2ab60 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ean for some oth
2ab70 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e  er reason, but n
2ab80 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
2ab90 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  then SQLITE_OK.*
2aba0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  * is returned by
2abb0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2abc0 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74  keClean() is not
2abd0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
2abe0 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
2abf0 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64  ss(void *p, PgHd
2ac00 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
2ac10 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
2ac20 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20  r *)p;.  int rc 
2ac30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2ac40 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
2ac50 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
2ac60 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
2ac70 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
2ac80 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e  );..  /* The doN
2ac90 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62  otSpill NOSYNC b
2aca0 69 74 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  it is set during
2acb0 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e   times when doin
2acc0 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a  g a sync of.  **
2acd0 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64   journal (and ad
2ace0 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65  ding a new heade
2acf0 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  r) is not allowe
2ad00 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a  d.  This occurs.
2ad10 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c    ** during call
2ad20 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
2ad30 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74  rWrite() while t
2ad40 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c  rying to journal
2ad50 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70   multiple.  ** p
2ad60 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74  ages belonging t
2ad70 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  o the same secto
2ad80 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
2ad90 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c   doNotSpill ROLL
2ada0 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69 74  BACK and OFF bit
2adb0 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63  s inhibits all c
2adc0 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20  ache spilling.  
2add0 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ** regardless of
2ade0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2adf0 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  a sync is requir
2ae00 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74  ed.  This is set
2ae10 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72   during.  ** a r
2ae20 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75 73  ollback or by us
2ae30 65 72 20 72 65 71 75 65 73 74 2c 20 72 65 73 70  er request, resp
2ae40 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20  ectively..  **. 
2ae50 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20   ** Spilling is 
2ae60 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20  also prohibited 
2ae70 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72  when in an error
2ae80 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68 61   state since tha
2ae90 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61  t could.  ** lea
2aea0 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
2aeb0 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74  rruption.   In t
2aec0 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
2aed0 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20 20  mentation it .  
2aee0 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  ** is impossible
2aef0 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63   for sqlite3Pcac
2af00 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20  heFetch() to be 
2af10 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61  called with crea
2af20 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77  teFlag==3.  ** w
2af30 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f  hile in the erro
2af40 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69  r state, hence i
2af50 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  t is impossible 
2af60 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
2af70 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c   to.  ** be call
2af80 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  ed in the error 
2af90 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65  state.  Neverthe
2afa0 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65  less, we include
2afb0 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20   a NEVER().  ** 
2afc0 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72  test for the err
2afd0 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61  or state as a sa
2afe0 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  feguard against 
2aff0 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a  future changes..
2b000 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
2b010 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
2b020 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
2b030 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73 65  E_OK;.  testcase
2b040 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2b050 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2b060 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74  _ROLLBACK );.  t
2b070 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2b080 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2b090 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20  ILLFLAG_OFF );. 
2b0a0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2b0b0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2b0c0 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43  SPILLFLAG_NOSYNC
2b0d0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
2b0e0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20  ->doNotSpill.   
2b0f0 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e  && ((pPager->doN
2b100 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c  otSpill & (SPILL
2b110 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50  FLAG_ROLLBACK|SP
2b120 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30  ILLFLAG_OFF))!=0
2b130 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e  .      || (pPg->
2b140 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
2b150 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20 29  ED_SYNC)!=0).  )
2b160 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2b170 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
2b180 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
2b190 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
2b1a0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
2b1b0 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67   /* Write a sing
2b1c0 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69  le frame for thi
2b1d0 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f  s page to the lo
2b1e0 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
2b1f0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52  ubjournalPageIfR
2b200 65 71 75 69 72 65 64 28 70 50 67 29 3b 20 0a 20  equired(pPg); . 
2b210 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b220 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2b230 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65   = pagerWalFrame
2b240 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30  s(pPager, pPg, 0
2b250 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
2b260 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53  lse{.  .    /* S
2b270 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2b280 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
2b290 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
2b2a0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2b2b0 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c  ED_SYNC .     ||
2b2c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2b2d0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
2b2e0 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20  CHEMOD.    ){.  
2b2f0 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
2b300 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b  rnal(pPager, 1);
2b310 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2b320 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
2b330 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2b340 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2b350 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
2b360 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b370 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
2b380 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  rt( (pPg->flags&
2b390 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2b3a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
2b3b0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
2b3c0 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70  gelist(pPager, p
2b3d0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
2b3e0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
2b3f0 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a  ge as clean. */.
2b400 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b410 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52  _OK ){.    PAGER
2b420 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25  TRACE(("STRESS %
2b430 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
2b440 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2b450 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
2b460 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2b470 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
2b480 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ..  return pager
2b490 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
2b4a0 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  c); .}.../*.** A
2b4b0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
2b4c0 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67  ialize a new Pag
2b4d0 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75  er object and pu
2b4e0 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  t a pointer to i
2b4f0 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72  t.** in *ppPager
2b500 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75  . The pager shou
2b510 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  ld eventually be
2b520 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e   freed by passin
2b530 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  g it.** to sqlit
2b540 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a  e3PagerClose()..
2b550 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
2b560 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
2b570 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
2b580 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2b590 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69   open..** If zFi
2b5a0 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
2b5b0 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
2b5c0 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
2b5d0 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
2b5e0 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
2b5f0 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
2b600 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66  hed. Temporary f
2b610 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65  iles are be dele
2b620 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
2b630 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61  ally when they a
2b640 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46  re closed. If zF
2b650 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
2b660 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61  ory:" then .** a
2b670 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
2b680 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
2b690 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
2b6a0 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a  tten to disk. .*
2b6b0 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73  * This can be us
2b6c0 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
2b6d0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2b6e0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
2b6f0 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65   nExtra paramete
2b700 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  r specifies the 
2b710 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2b720 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
2b730 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68  ed.** along with
2b740 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72   each page refer
2b750 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65  ence. This space
2b760 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f   is available to
2b770 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61   the user.** via
2b780 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
2b790 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e  rGetExtra() API.
2b7a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
2b7b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65   argument is use
2b7c0 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f  d to specify pro
2b7d0 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66  perties that aff
2b7e0 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  ect the.** opera
2b7f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
2b800 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  r. It should be 
2b810 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77  passed some bitw
2b820 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a  ise combination.
2b830 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f  ** of the PAGER_
2b840 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  * flags..**.** T
2b850 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61  he vfsFlags para
2b860 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
2b870 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68  sk to pass to th
2b880 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
2b890 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65  r.** of the xOpe
2b8a0 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  n() method of th
2b8b0 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77  e supplied VFS w
2b8c0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65  hen opening file
2b8d0 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  s. .**.** If the
2b8e0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   pager object is
2b8f0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
2b900 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
2b910 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63  e opened .** suc
2b920 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54  cessfully, SQLIT
2b930 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2b940 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65   and *ppPager se
2b950 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  t to point to.**
2b960 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f   the new pager o
2b970 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72  bject. If an err
2b980 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61  or occurs, *ppPa
2b990 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ger is set to NU
2b9a0 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  LL.** and error 
2b9b0 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54  code returned. T
2b9c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
2b9d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2b9e0 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33  OMEM.** (sqlite3
2b9f0 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64  Malloc() is used
2ba00 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
2ba10 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e  ory), SQLITE_CAN
2ba20 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72  TOPEN or .** var
2ba30 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58  ious SQLITE_IO_X
2ba40 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e  XX errors..*/.in
2ba50 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
2ba60 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
2ba70 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f  s *pVfs,       /
2ba80 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
2ba90 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65  le system to use
2baa0 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70   */.  Pager **pp
2bab0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
2bac0 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68  * OUT: Return th
2bad0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
2bae0 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
2baf0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2bb00 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
2bb10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2bb20 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
2bb30 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
2bb40 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
2bb50 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f   bytes append to
2bb60 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
2bb70 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  page */.  int fl
2bb80 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2bb90 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74     /* flags cont
2bba0 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c  rolling this fil
2bbb0 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
2bbc0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2bbd0 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  /* flags passed 
2bbe0 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
2bbf0 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
2bc00 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
2bc10 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20  it)(DbPage*) /* 
2bc20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e  Function to rein
2bc30 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a  itialize pages *
2bc40 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b  /.){.  u8 *pPtr;
2bc50 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2bc60 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50   = 0;       /* P
2bc70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61  ager object to a
2bc80 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75  llocate and retu
2bc90 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  rn */.  int rc =
2bca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2bcb0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2bcc0 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  */.  int tempFil
2bcd0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  e = 0;        /*
2bce0 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66   True for temp f
2bcf0 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d  iles (incl. in-m
2bd00 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a  emory files) */.
2bd10 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
2bd20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2bd30 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
2bd40 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
2bd50 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  */.  int readOnl
2bd60 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  y = 0;        /*
2bd70 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2bd80 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c   a read-only fil
2bd90 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e  e */.  int journ
2bda0 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20  alFileSize;     
2bdb0 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
2bdc0 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f  cate for each jo
2bdd0 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68  urnal fd */.  ch
2bde0 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ar *zPathname = 
2bdf0 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70  0;     /* Full p
2be00 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20  ath to database 
2be10 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
2be20 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
2be30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2be40 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61  bytes in zPathna
2be50 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a  me */.  int useJ
2be60 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
2be70 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
2be80 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c  RNAL)==0; /* Fal
2be90 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e  se to omit journ
2bea0 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63  al */.  int pcac
2beb0 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  heSize = sqlite3
2bec0 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20  PcacheSize();   
2bed0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
2bee0 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61  allocate for PCa
2bef0 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50  che */.  u32 szP
2bf00 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2bf10 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2bf20 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  ZE;  /* Default 
2bf30 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63  page size */.  c
2bf40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20  onst char *zUri 
2bf50 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61  = 0;    /* URI a
2bf60 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  rgs to copy */. 
2bf70 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20   int nUri = 0;  
2bf80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2bf90 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2bfa0 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72  URI args at *zUr
2bfb0 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  i */..  /* Figur
2bfc0 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73  e out how much s
2bfd0 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64  pace is required
2bfe0 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61   for each journa
2bff0 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20  l file-handle.  
2c000 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77  ** (there are tw
2c010 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d  o of them, the m
2c020 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
2c030 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29  the sub-journal)
2c040 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74  . This.  ** is t
2c050 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65  he maximum space
2c060 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
2c070 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
2c080 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a  al file handle .
2c090 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c    ** and a regul
2c0a0 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ar journal file-
2c0b0 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61  handle. Note tha
2c0c0 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75  t a "regular jou
2c0d0 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a  rnal-handle".  *
2c0e0 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70  * may be a wrapp
2c0f0 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61  er capable of ca
2c100 63 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ching the first 
2c110 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  portion of the j
2c120 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
2c130 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d   in memory to im
2c140 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d  plement the atom
2c150 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
2c160 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a  ation (see .  **
2c170 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75   source file jou
2c180 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20  rnal.c)..  */.  
2c190 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
2c1a0 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c  alSize(pVfs)>sql
2c1b0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
2c1c0 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72  ze() ){.    jour
2c1d0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
2c1e0 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72  UND8(sqlite3Jour
2c1f0 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a  nalSize(pVfs));.
2c200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75    }else{.    jou
2c210 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
2c220 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d  OUND8(sqlite3Mem
2c230 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a  JournalSize());.
2c240 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
2c250 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
2c260 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73  e to NULL in cas
2c270 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
2c280 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  s. */.  *ppPager
2c290 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53   = 0;..#ifndef S
2c2a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
2c2b0 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20  YDB.  if( flags 
2c2c0 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29  & PAGER_MEMORY )
2c2d0 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b  {.    memDb = 1;
2c2e0 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  .    if( zFilena
2c2f0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2c300 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74  0] ){.      zPat
2c310 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2c320 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65  bStrDup(0, zFile
2c330 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
2c340 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29   zPathname==0  )
2c350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2c360 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6e 50 61 74  OMEM;.      nPat
2c370 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2c380 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2c390 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e  e);.      zFilen
2c3a0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ame = 0;.    }. 
2c3b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2c3c0 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
2c3d0 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
2c3e0 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
2c3f0 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
2c400 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
2c410 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
2c420 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
2c430 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
2c440 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
2c450 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
2c460 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
2c470 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
2c480 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
2c490 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2c4a0 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  0] ){.    const 
2c4b0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61  char *z;.    nPa
2c4c0 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
2c4d0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
2c4e0 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2c4f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
2c500 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  0, nPathname*2);
2c510 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
2c520 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
2c530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2c540 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50  EM;.    }.    zP
2c550 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20  athname[0] = 0; 
2c560 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69  /* Make sure ini
2c570 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66  tialized even if
2c580 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20   FullPathname() 
2c590 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20  fails */.    rc 
2c5a0 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
2c5b0 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
2c5c0 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
2c5d0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
2c5e0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2c5f0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2c600 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2c610 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c  z = zUri = &zFil
2c620 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72  ename[sqlite3Str
2c630 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
2c640 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
2c650 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d  *z ){.      z +=
2c660 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2c670 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b  (z)+1;.      z +
2c680 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2c690 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  0(z)+1;.    }.  
2c6a0 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26    nUri = (int)(&
2c6b0 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20  z[1] - zUri);.  
2c6c0 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d    assert( nUri>=
2c6d0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
2c6e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50  =SQLITE_OK && nP
2c6f0 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e  athname+8>pVfs->
2c700 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  mxPathname ){.  
2c710 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2c720 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
2c730 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74   the journal pat
2c740 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  h required by.  
2c750 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
2c760 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ase being opened
2c770 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68   will be more th
2c780 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  an pVfs->mxPathn
2c790 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
2c7a0 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
2c7b0 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  is means the dat
2c7c0 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
2c7d0 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a  opened,.      **
2c7e0 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   as it will not 
2c7f0 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  be possible to o
2c800 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
2c810 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20  file or even.   
2c820 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20     ** check for 
2c830 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65  a hot-journal be
2c840 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20  fore reading..  
2c850 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2c860 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
2c870 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
2c880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c890 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2c8a0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2c8b0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2c8c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2c8d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
2c8e0 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
2c8f0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2c900 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63  re, PCache objec
2c910 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65  t, the.  ** thre
2c920 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2c930 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  rs, the database
2c940 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74   file name and t
2c950 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
2c960 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20   file name. The 
2c970 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79  layout in memory
2c980 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
2c990 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61    **.  **     Pa
2c9a0 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20  ger object      
2c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2c9c0 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74  izeof(Pager) byt
2c9d0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61  es).  **     PCa
2c9e0 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20  che object      
2c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
2ca00 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2ca10 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2ca20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
2ca30 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20  handle          
2ca40 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c    (pVfs->szOsFil
2ca50 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2ca60 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69    Sub-journal fi
2ca70 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2ca80 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2ca90 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2caa0 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20     Main journal 
2cab0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2cac0 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
2cad0 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
2cae0 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
2caf0 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2cb00 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31      (nPathname+1
2cb10 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2cb20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   Journal file na
2cb30 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2cb40 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20   (nPathname+8+1 
2cb50 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50  bytes).  */.  pP
2cb60 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  tr = (u8 *)sqlit
2cb70 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
2cb80 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
2cb90 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20  *pPager)) +     
2cba0 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
2cbb0 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ure */.    ROUND
2cbc0 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20  8(pcacheSize) + 
2cbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61            /* PCa
2cbe0 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  che object */.  
2cbf0 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73    ROUND8(pVfs->s
2cc00 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20  zOsFile) +      
2cc10 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
2cc20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72  file */.    jour
2cc30 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20  nalFileSize * 2 
2cc40 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  +          /* Th
2cc50 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
2cc60 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74  les */ .    nPat
2cc70 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2cc80 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46   +         /* zF
2cc90 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  ilename */.    n
2cca0 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32  Pathname + 8 + 2
2ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ccc0 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66   zJournal */.#if
2ccd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2cce0 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68  _WAL.    + nPath
2ccf0 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20  name + 4 + 2    
2cd00 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20          /* zWal 
2cd10 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20  */.#endif.  );. 
2cd20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2cd30 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51  YTE_ALIGNMENT(SQ
2cd40 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
2cd50 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2cd60 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72  ) );.  if( !pPtr
2cd70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2cd80 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2cd90 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
2cda0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2cdb0 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20  }.  pPager =    
2cdc0 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72            (Pager
2cdd0 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67  *)(pPtr);.  pPag
2cde0 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20  er->pPCache =   
2cdf0 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20   (PCache*)(pPtr 
2ce00 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  += ROUND8(sizeof
2ce10 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70  (*pPager)));.  p
2ce20 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73  Pager->fd =   (s
2ce30 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2ce40 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61  tr += ROUND8(pca
2ce50 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61  cheSize));.  pPa
2ce60 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c  ger->sjfd = (sql
2ce70 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2ce80 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d   += ROUND8(pVfs-
2ce90 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70  >szOsFile));.  p
2cea0 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73  Pager->jfd =  (s
2ceb0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2cec0 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2ced0 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72  eSize);.  pPager
2cee0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20  ->zFilename =   
2cef0 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2cf00 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2cf10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2cf20 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2cf30 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  T(pPager->jfd) )
2cf40 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
2cf50 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e  the Pager.zFilen
2cf60 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ame and Pager.zJ
2cf70 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20  ournal buffers, 
2cf80 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
2cf90 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20    if( zPathname 
2cfa0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
2cfb0 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20  Pathname>0 );.  
2cfc0 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
2cfd0 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70  al =   (char*)(p
2cfe0 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65  Ptr += nPathname
2cff0 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20   + 1 + nUri);.  
2d000 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2d010 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
2d020 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2d030 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20  );.    if( nUri 
2d040 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72  ) memcpy(&pPager
2d050 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
2d060 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20  hname+1], zUri, 
2d070 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2d080 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
2d090 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
2d0a0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
2d0b0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2d0c0 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2d0d0 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30  e], "-journal\00
2d0e0 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71  0", 8+2);.    sq
2d0f0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2d100 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2d110 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  me, pPager->zJou
2d120 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  rnal);.#ifndef S
2d130 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2d140 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20     pPager->zWal 
2d150 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  = &pPager->zJour
2d160 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b  nal[nPathname+8+
2d170 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
2d180 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61  Pager->zWal, zPa
2d190 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2d1a0 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2d1b0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61  pPager->zWal[nPa
2d1c0 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30  thname], "-wal\0
2d1d0 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73  00", 4+1);.    s
2d1e0 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2d1f0 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2d200 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  ame, pPager->zWa
2d210 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  l);.#endif.    s
2d220 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2d230 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
2d240 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
2d250 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
2d260 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
2d270 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
2d280 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
2d290 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2d2a0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2d2b0 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me[0] ){.    int
2d2c0 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
2d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d2e0 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
2d2f0 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
2d300 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2d310 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2d320 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2d330 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
2d340 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
2d350 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d      assert( !mem
2d360 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e  Db );.    readOn
2d370 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
2d380 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2d390 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2d3a0 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
2d3b0 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
2d3c0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2d3d0 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f  ess,.    ** choo
2d3e0 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
2d3f0 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
2d400 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
2d410 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2d420 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
2d430 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2d440 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2d450 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
2d460 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
2d470 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
2d480 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2d490 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
2d4a0 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
2d4b0 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
2d4c0 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
2d4d0 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
2d4e0 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
2d4f0 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a  tomically..    *
2d500 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2d510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d520 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
2d530 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
2d540 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
2d550 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  ->fd);.      if(
2d560 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20   !readOnly ){.  
2d570 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
2d580 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
2d590 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2d5a0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2d5b0 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
2d5c0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2d5d0 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ZE);.        if(
2d5e0 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67   szPageDflt<pPag
2d5f0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29  er->sectorSize )
2d600 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2d610 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2d620 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  ze>SQLITE_MAX_DE
2d630 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
2d640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2d650 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2d660 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2d670 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
2d680 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d690 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2d6a0 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d  t = (u32)pPager-
2d6b0 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
2d6c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d6d0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2d6e0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2d6f0 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20  RITE.        {. 
2d700 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b           int ii;
2d710 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2d720 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2d730 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
2d740 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
2d750 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2d760 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
2d770 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
2d780 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2d790 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2d7a0 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
2d7b0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2d7c0 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69  ii=szPageDflt; i
2d7d0 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  i<=SQLITE_MAX_DE
2d7e0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2d7f0 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20   ii=ii*2){.     
2d800 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
2d810 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2d820 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
2d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
2d840 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
2d850 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2d860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d870 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2d880 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
2d890 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33  noLock = sqlite3
2d8a0 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69  _uri_boolean(zFi
2d8b0 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22  lename, "nolock"
2d8c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2d8d0 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
2d8e0 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d  CAP_IMMUTABLE)!=
2d8f0 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69  0.       || sqli
2d900 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2d910 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75  zFilename, "immu
2d920 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20  table", 0) ){.  
2d930 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67 73          vfsFlags
2d940 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
2d950 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
2d960 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b      goto act_lik
2d970 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20  e_temp_file;.   
2d980 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
2d990 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  se{.    /* If a 
2d9a0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
2d9b0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
2d9c0 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
2d9d0 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
2d9e0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
2d9f0 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
2da00 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
2da10 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
2da20 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
2da30 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
2da40 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
2da50 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
2da60 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2da70 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72  branch is also r
2da80 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  un for an in-mem
2da90 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e  ory database. An
2daa0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a   in-memory.    *
2dab0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  * database is th
2dac0 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70  e same as a temp
2dad0 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65  -file that is ne
2dae0 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20  ver written out 
2daf0 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61  to.    ** disk a
2db00 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65  nd uses an in-me
2db10 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  mory rollback jo
2db20 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  urnal..    **.  
2db30 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2db40 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66   also runs for f
2db50 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69  iles marked as i
2db60 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  mmutable..    */
2db70 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f   .act_like_temp_
2db80 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69  file:.    tempFi
2db90 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  le = 1;.    pPag
2dba0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
2dbb0 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f  ER_READER;     /
2dbc0 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72  * Pretend we alr
2dbd0 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
2dbe0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
2dbf0 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56  eLock = EXCLUSIV
2dc00 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72  E_LOCK;    /* Pr
2dc10 65 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20  etend we are in 
2dc20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a  EXCLUSIVE mode *
2dc30 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  /.    pPager->no
2dc40 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20  Lock = 1;       
2dc50 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2dc60 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20  o locking */.   
2dc70 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73   readOnly = (vfs
2dc80 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
2dc90 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d  N_READONLY);.  }
2dca0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
2dcb0 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67  wing call to Pag
2dcc0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
2dcd0 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68  serves to set th
2dce0 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a  e value of .  **
2dcf0 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
2dd00 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  and to allocate 
2dd10 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70  the Pager.pTmpSp
2dd20 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f  ace buffer..  */
2dd30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2dd40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2dd50 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
2dd60 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  b==0 );.    rc =
2dd70 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2dd80 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
2dd90 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31   &szPageDflt, -1
2dda0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2ddb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ddc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
2ddd0 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
2dde0 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69  e object. */.  i
2ddf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2de00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2de10 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
2de20 20 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e     nExtra = ROUN
2de30 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  D8(nExtra);.    
2de40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
2de50 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c  heOpen(szPageDfl
2de60 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44  t, nExtra, !memD
2de70 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2de80 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
2de90 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
2dea0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
2deb0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2dec0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
2ded0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
2dee0 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
2def0 20 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72    Pager structur
2df00 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
2df10 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2df20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2df30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
2df40 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
2df50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
2df60 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
2df70 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71  mpSpace);.    sq
2df80 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
2df90 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
2dfa0 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  c;.  }..  PAGERT
2dfb0 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
2dfc0 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
2dfd0 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
2dfe0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2dff0 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
2e000 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
2e010 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2e020 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
2e030 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2e040 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
2e050 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  al;.  /* pPager-
2e060 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
2e070 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2e080 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
2e090 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
2e0a0 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ef = 0; */.  /* 
2e0b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
2e0c0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e0d0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
2e0e0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e0f0 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
2e100 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
2e110 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
2e120 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
2e130 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
2e140 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
2e150 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e160 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
2e170 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
2e180 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
2e190 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
2e1a0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2e1b0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
2e1c0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
2e1d0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2e1e0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2e1f0 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
2e200 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2e210 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
2e220 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
2e230 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
2e240 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
2e250 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2e260 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
2e270 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
2e280 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
2e290 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
2e2a0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
2e2b0 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65  readOnly;.  asse
2e2c0 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  rt( useJournal |
2e2d0 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
2e2e0 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le );.  pPager->
2e2f0 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
2e300 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28  >tempFile;.  if(
2e310 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2e320 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2e330 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d  Pager->fullSync=
2e340 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2e350 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  ( pPager->syncFl
2e360 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ags==0 );.    as
2e370 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61  sert( pPager->wa
2e380 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  lSyncFlags==0 );
2e390 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e3a0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2e3b0 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  gs==0 );.  }else
2e3c0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75  {.    pPager->fu
2e3d0 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  llSync = 1;.    
2e3e0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
2e3f0 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
2e400 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
2e410 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
2e420 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2e430 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43  ORMAL | WAL_SYNC
2e440 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20  _TRANSACTIONS;. 
2e450 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
2e460 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2e470 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
2e480 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2e490 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
2e4a0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
2e4b0 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
2e4c0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
2e4d0 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
2e4e0 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28  ager->nExtra = (
2e4f0 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50  u16)nExtra;.  pP
2e500 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
2e510 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f  eLimit = SQLITE_
2e520 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f  DEFAULT_JOURNAL_
2e530 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73  SIZE_LIMIT;.  as
2e540 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2e550 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70  ger->fd) || temp
2e560 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63  File );.  setSec
2e570 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2e580 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e  .  if( !useJourn
2e590 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  al ){.    pPager
2e5a0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2e5b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2e5c0 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69  E_OFF;.  }else i
2e5d0 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  f( memDb ){.    
2e5e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2e5f0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2e600 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a  NALMODE_MEMORY;.
2e610 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
2e620 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
2e630 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2e640 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
2e650 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  rg = 0; */.  pPa
2e660 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
2e670 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d   xReinit;.  /* m
2e680 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
2e690 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
2e6a0 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
2e6b0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e6c0 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f  szMmap = SQLITE_
2e6d0 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a  DEFAULT_MMAP_SIZ
2e6e0 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74  E // will be set
2e6f0 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a   by btree.c */..
2e700 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
2e710 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ger;.  return SQ
2e720 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20  LITE_OK;.}.../* 
2e730 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
2e740 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
2e750 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64  s not be deleted
2e760 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20   or renamed out 
2e770 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68  from.** under th
2e780 65 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  e pager.  Return
2e790 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2e7a0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74  e database is st
2e7b0 69 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68  ill were it ough
2e7c0 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69  t.** to be on di
2e7d0 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  sk.  Return non-
2e7e0 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41  zero (SQLITE_REA
2e7f0 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72  DONLY_DBMOVED or
2e800 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
2e810 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73  r.** code from s
2e820 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
2e830 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  ) if the databas
2e840 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69  e has gone missi
2e850 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
2e860 74 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f  t databaseIsUnmo
2e870 76 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  ved(Pager *pPage
2e880 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f  r){.  int bHasMo
2e890 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ved = 0;.  int r
2e8a0 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
2e8b0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74  ->tempFile ) ret
2e8c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2e8d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
2e8e0 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ize==0 ) return 
2e8f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
2e900 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69  ert( pPager->zFi
2e910 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72  lename && pPager
2e920 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  ->zFilename[0] )
2e930 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2e940 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
2e950 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
2e960 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44  _FCNTL_HAS_MOVED
2e970 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20  , &bHasMoved);. 
2e980 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e990 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
2e9a0 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f  /* If the HAS_MO
2e9b0 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  VED file-control
2e9c0 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65   is unimplemente
2e9d0 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  d, assume that t
2e9e0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68  he file.    ** h
2e9f0 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65  as not been move
2ea00 64 2e 20 20 54 68 61 74 20 69 73 20 74 68 65 20  d.  That is the 
2ea10 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76  historical behav
2ea20 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70  ior of SQLite: p
2ea30 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76  rior to.    ** v
2ea40 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74  ersion 3.8.3, it
2ea50 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a   never checked *
2ea60 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
2ea70 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
2ea80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ea90 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a  && bHasMoved ){.
2eaa0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2eab0 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
2eac0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2ead0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
2eae0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2eaf0 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
2eb00 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
2eb10 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
2eb20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
2eb30 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
2eb40 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
2eb50 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
2eb60 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
2eb70 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
2eb80 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
2eb90 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
2eba0 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
2ebb0 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
2ebc0 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
2ebd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
2ebe0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
2ebf0 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
2ec00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
2ec10 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  eria are met:.**
2ec20 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72  .**   * The jour
2ec30 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2ec40 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
2ec50 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e  em, and.**   * N
2ec60 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  o process holds 
2ec70 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2ec80 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
2ec90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2eca0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
2ecb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
2ecc0 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20  self is greater 
2ecd0 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20  than 0 bytes in 
2ece0 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  size, and.**   *
2ecf0 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
2ed00 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2ed10 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
2ed20 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a  s not 0x00..**.*
2ed30 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
2ed40 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2ed50 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
2ed60 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
2ed70 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
2ed80 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
2ed90 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
2eda0 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
2edb0 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
2edc0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
2edd0 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
2ede0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2edf0 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
2ee00 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
2ee10 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
2ee20 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
2ee30 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2ee40 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
2ee50 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
2ee60 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68   not check if th
2ee70 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20  ere is a master 
2ee80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
2ee90 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
2eea0 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  f the file. If t
2eeb0 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61  here is, and tha
2eec0 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
2eed0 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f   file.** does no
2eee0 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68  t exist, then th
2eef0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2ef00 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2ef10 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
2ef20 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
2ef30 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c  ill return a fal
2ef40 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65  se-positive. The
2ef50 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2ef60 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
2ef70 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
2ef80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2ef90 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
2efa0 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20  ot and .** will 
2efb0 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  not roll it back
2efc0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f  . .**.** If a ho
2efd0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
2efe0 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74  s found to exist
2eff0 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
2f000 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53  t to 1 and .** S
2f010 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2f020 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75  d. If no hot-jou
2f030 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
2f040 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69  sent, *pExists i
2f050 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e  s.** set to 0 an
2f060 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
2f070 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2f080 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2f090 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64  e trying.** to d
2f0a0 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2f0b0 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f   or not a hot-jo
2f0c0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2f0d0 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a  s, the IO error.
2f0e0 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  ** code is retur
2f0f0 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
2f100 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73  e of *pExists is
2f110 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
2f120 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
2f130 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
2f140 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
2f150 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
2f160 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2f170 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2f180 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2f190 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2f1a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2f1b0 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20  */.  int exists 
2f1c0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2f1d0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2f1e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2f1f0 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
2f200 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73   jrnlOpen = !!is
2f210 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2f220 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
2f230 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2f240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
2f250 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2f260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2f270 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2f280 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61  GER_OPEN );..  a
2f290 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d  ssert( jrnlOpen=
2f2a0 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f  =0 || ( sqlite3O
2f2b0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
2f2c0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a  istics(pPager->j
2f2d0 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45  fd) &.    SQLITE
2f2e0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
2f2f0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29  LE_WHEN_OPEN.  )
2f300 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d  );..  *pExists =
2f310 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f   0;.  if( !jrnlO
2f320 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
2f330 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2f340 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2f350 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
2f360 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
2f370 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66  xists);.  }.  if
2f380 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f390 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
2f3a0 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b   int locked = 0;
2f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f3c0 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f  True if some pro
2f3d0 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
2f3e0 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20  ERVED lock */.. 
2f3f0 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69     /* Race condi
2f400 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74  tion here:  Anot
2f410 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
2f420 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64  t have been hold
2f430 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ing the.    ** t
2f440 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
2f450 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72   and have a jour
2f460 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20  nal open at the 
2f470 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2f480 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61  ) .    ** call a
2f490 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64  bove, but then d
2f4a0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
2f4b0 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c  l and drop the l
2f4c0 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ock before.    *
2f4d0 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20  * we get to the 
2f4e0 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
2f4f0 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
2f500 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66  Lock() call.  If
2f510 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
2f520 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72  the case, this r
2f530 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69  outine might thi
2f540 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  nk there is a ho
2f550 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20  t journal when. 
2f560 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68     ** in fact th
2f570 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68  ere is none.  Th
2f580 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  is results in a 
2f590 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
2f5a0 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  hich will.    **
2f5b0 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
2f5c0 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72  y the playback r
2f5d0 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20  outine.  Ticket 
2f5e0 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20  #3883..    */.  
2f5f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2f600 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2f610 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
2f620 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20  ocked);.    if( 
2f630 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2f640 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
2f650 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
2f660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f670 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2f680 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
2f690 65 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  e */..      rc =
2f6a0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
2f6b0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
2f6c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2f6d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f6e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
2f6f0 74 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20 70  tabase is zero p
2f700 61 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ages in size, th
2f710 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69  at means that ei
2f720 74 68 65 72 20 28 31 29 20 74 68 65 0a 20 20 20  ther (1) the.   
2f730 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
2f740 69 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72 6f  is a remnant fro
2f750 6d 20 61 20 70 72 69 6f 72 20 64 61 74 61 62 61  m a prior databa
2f760 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
2f770 20 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20 20   name where.    
2f780 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
2f790 61 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f 74  ase file but not
2f7a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
2f7b0 20 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32 29   deleted, or (2)
2f7c0 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20 20   the initial.   
2f7d0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
2f7e0 69 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61 74  ion that populat
2f7f0 65 73 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  es a new databas
2f800 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  e is being rolle
2f810 64 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  d back..        
2f820 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
2f830 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  e, the journal f
2f840 69 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65 74  ile can be delet
2f850 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 61  ed.  However, ta
2f860 6b 65 20 63 61 72 65 0a 20 20 20 20 20 20 20 20  ke care.        
2f870 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74 65  ** not to delete
2f880 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f890 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
2f8a0 64 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a 20  dy open due to. 
2f8b0 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
2f8c0 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a  l_mode=PERSIST..
2f8d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f8e0 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
2f8f0 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  && !jrnlOpen ){.
2f900 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2f910 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
2f920 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oc();.          
2f930 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  if( pagerLockDb(
2f940 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
2f950 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f  _LOCK)==SQLITE_O
2f960 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2f970 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
2f980 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2f990 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
2f9a0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
2f9b0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2f9c0 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63  ode ) pagerUnloc
2f9d0 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
2f9e0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2f9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2fa00 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
2fa10 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2fa20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2fa30 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
2fa40 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
2fa50 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
2fa60 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
2fa70 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
2fa80 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
2fa90 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2faa0 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
2fab0 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
2fac0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
2fad0 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
2fae0 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
2faf0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
2fb00 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
2fb10 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
2fb20 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
2fb30 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
2fb40 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
2fb50 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
2fb60 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
2fb70 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
2fb80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2fb90 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2fba0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
2fbb0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
2fbc0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
2fbd0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2fbe0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2fbf0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2fc00 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2fc10 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
2fc20 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20  >jfd, f, &f);.  
2fc30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fc40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2fc50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2fc60 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
2fc70 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2fc80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
2fc90 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
2fca0 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
2fcb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2fcc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fcd0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
2fce0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
2fcf0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2fd00 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
2fd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2fd20 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2fd30 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2fd40 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
2fd50 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
2fd60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fd70 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66     *pExists = (f
2fd80 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  irst!=0);.      
2fd90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
2fda0 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
2fdb0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
2fdc0 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
2fdd0 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   open the rollba
2fde0 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
2fdf0 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20  in order to see 
2fe00 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
2fe10 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f 20  * it has a zero 
2fe20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
2fe30 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
2fe40 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
2fe50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
2fe60 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
2fe70 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
2fe80 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
2fe90 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
2fea0 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
2feb0 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
2fec0 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
2fed0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
2fee0 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
2fef0 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
2ff00 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
2ff10 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
2ff20 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
2ff30 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
2ff40 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
2ff50 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
2ff60 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
2ff70 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
2ff80 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
2ff90 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
2ffa0 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
2ffb0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
2ffc0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
2ffd0 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
2ffe0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
2fff0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
30000 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
30010 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
30020 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30030 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
30040 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30050 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
30060 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30070 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
30080 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
30090 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
300a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
300b0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20  ase file..** It 
300c0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
300d0 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  ll sqlite3PagerA
300e0 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61  cquire() until a
300f0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
30100 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
30110 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
30120 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
30130 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
30140 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
30150 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
30160 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
30170 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
30180 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
30190 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
301a0 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
301b0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
301c0 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
301d0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
301e0 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
301f0 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
30200 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
30210 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
30220 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
30230 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
30240 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
30250 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
30260 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
30270 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
30280 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
30290 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
302a0 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
302b0 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
302c0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
302d0 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
302e0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
302f0 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
30300 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
30310 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
30320 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
30330 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
30340 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
30350 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
30360 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
30370 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
30380 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30390 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
303a0 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
303b0 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
303c0 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
303d0 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
303e0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
303f0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
30400 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
30410 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
30420 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
30430 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
30440 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
30450 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
30460 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
30470 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
30480 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
30490 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
304a0 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
304b0 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
304c0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
304d0 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
304e0 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
304f0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
30500 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
30510 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
30520 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
30530 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
30540 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
30550 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
30560 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
30570 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
30580 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
30590 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
305a0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
305b0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
305c0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
305d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
305e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
305f0 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
30600 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
30610 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
30620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30630 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
30640 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
30650 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
30660 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
30670 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
30680 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
30690 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
306a0 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
306b0 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
306c0 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
306d0 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
306e0 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
306f0 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
30700 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
30710 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
30720 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
30730 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   mode..  */.  as
30740 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
30750 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
30760 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
30770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
30780 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
30790 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
307a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
307b0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
307c0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
307d0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
307e0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d  );.  if( NEVER(M
307f0 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
30800 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75  errCode) ){ retu
30810 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
30820 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61  de; }..  if( !pa
30830 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
30840 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  ) && pPager->eSt
30850 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30860 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a  ){.    int bHotJ
30870 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20  ournal = 1;     
30880 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30890 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68  there exists a h
308a0 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ot journal-file 
308b0 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
308c0 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72  !MEMDB );..    r
308d0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
308e0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
308f0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
30900 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30910 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
30920 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
30930 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50  k==NO_LOCK || pP
30940 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
30950 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
30960 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
30970 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
30980 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
30990 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
309a0 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
309b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
309c0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
309d0 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
309e0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
309f0 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
30a00 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
30a10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
30a20 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
30a30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  ){.      rc = ha
30a40 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
30a50 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c  er, &bHotJournal
30a60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
30a70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30a80 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  {.      goto fai
30a90 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
30aa0 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29  f( bHotJournal )
30ab0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
30ac0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
30ad0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
30ae0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
30af0 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67  LBACK;.        g
30b00 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
30b10 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
30b20 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
30b30 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
30b40 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
30b50 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
30b60 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
30b70 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
30b80 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
30b90 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
30ba0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
30bb0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
30bc0 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
30bd0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
30be0 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
30bf0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
30c00 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
30c10 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
30c20 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
30c30 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
30c40 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
30c50 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
30c60 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
30c70 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
30c80 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
30c90 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
30ca0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
30cb0 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
30cc0 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
30cd0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
30ce0 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
30cf0 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
30d00 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
30d10 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
30d20 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
30d30 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
30d40 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
30d50 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
30d60 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
30d70 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
30d80 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
30d90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
30da0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
30db0 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
30dc0 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
30dd0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
30de0 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
30df0 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
30e00 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
30e10 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
30e20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
30e30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
30e40 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
30e50 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
30e60 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
30e70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30e80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
30e90 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
30ea0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
30eb0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
30ec0 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
30ed0 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
30ee0 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
30ef0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
30f00 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
30f10 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
30f20 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
30f30 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
30f40 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
30f50 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
30f60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
30f70 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
30f80 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
30f90 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
30fa0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
30fb0 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
30fc0 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
30fd0 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
30fe0 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
30ff0 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
31000 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
31010 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
31020 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
31030 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
31040 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
31050 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
31060 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
31070 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
31080 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
31090 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
310a0 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
310b0 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
310c0 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
310d0 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
310e0 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
310f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
31100 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
31110 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
31120 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
31130 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
31140 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
31150 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
31160 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
31170 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
31180 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
31190 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
311a0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
311b0 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
311c0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
311d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
311e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
311f0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
31200 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
31210 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
31220 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
31230 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
31240 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
31250 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
31260 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
31270 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
31280 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
31290 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
312a0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
312b0 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
312c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
312d0 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
312e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
312f0 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
31300 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
31310 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
31320 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
31330 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
31340 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31350 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
31360 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
31370 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
31380 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
31390 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
313a0 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
313b0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
313c0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
313d0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
313e0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
313f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31400 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
31410 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
31420 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
31430 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31440 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
31450 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
31460 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
31470 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
31480 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
31490 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
314a0 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
314b0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
314c0 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
314d0 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
314e0 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
314f0 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
31500 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
31510 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
31520 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
31530 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
31540 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
31550 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
31560 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
31570 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
31580 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
31590 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
315a0 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
315b0 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
315c0 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
315d0 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
315e0 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
315f0 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
31600 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
31610 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
31620 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
31630 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
31640 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
31650 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
31660 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31670 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
31680 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
31690 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
316a0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
316b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e     rc = pagerSyn
316c0 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
316d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
316e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
316f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
31700 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
31710 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
31720 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
31730 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
31740 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
31750 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
31760 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
31770 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
31780 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
31790 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
317a0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
317b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
317c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
317d0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
317e0 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72   taken if an err
317f0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
31800 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20  trying to open. 
31810 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c         ** or rol
31820 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  l back a hot-jou
31830 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69  rnal while holdi
31840 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
31850 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
31860 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    ** pager_unloc
31870 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
31880 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
31890 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75  e returning to u
318a0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a  nlock.        **
318b0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
318c0 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74  e unlock attempt
318d0 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67   fails, then Pag
318e0 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er.eLock must be
318f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
31900 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
31910 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  (see the comment
31920 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
31930 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20  ne for .        
31940 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
31950 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70  above for an exp
31960 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20  lanation). .    
31970 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31980 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  * In order to ge
31990 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  t pager_unlock()
319a0 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74   to do this, set
319b0 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
319c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45  .        ** PAGE
319d0 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69  R_ERROR now. Thi
319e0 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
319f0 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74  y counted as a t
31a00 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20  ransition.      
31a10 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74    ** to ERROR st
31a20 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  ate in the state
31a30 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20   diagram at the 
31a40 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
31a50 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e  ,.        ** sin
31a60 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ce we know that 
31a70 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f  the same call to
31a80 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
31a90 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20  will very.      
31aa0 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61    ** shortly tra
31ab0 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65  nsition the page
31ac0 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
31ad0 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c  OPEN state. Call
31ae0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
31af0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
31b00 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e  e() would fail n
31b10 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64  ow, as it should
31b20 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
31b30 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
31b40 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  e in ERROR state
31b50 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
31b60 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  zero outstanding
31b70 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a   page .        *
31b80 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20  * references..  
31b90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31ba0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
31bb0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
31bc0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
31bd0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
31be0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
31bf0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
31c00 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
31c10 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
31c20 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
31c30 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
31c40 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
31c50 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
31c60 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
31c70 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
31c80 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
31c90 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 70  r->tempFile && p
31ca0 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
31cb0 61 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  aredLock ){.    
31cc0 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
31cd0 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
31ce0 65 6e 20 61 63 71 75 69 72 65 64 20 74 68 65 6e  en acquired then
31cf0 20 63 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20   check to.      
31d00 2a 2a 20 73 65 65 20 69 66 20 74 68 65 20 64 61  ** see if the da
31d10 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
31d20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68  modified.  If th
31d30 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63  e database has c
31d40 68 61 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a  hanged,.      **
31d50 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
31d60 2e 20 20 54 68 65 20 68 61 73 48 65 6c 64 53 68  .  The hasHeldSh
31d70 61 72 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72  aredLock flag pr
31d80 65 76 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d  events this from
31d90 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72  .      ** occurr
31da0 69 6e 67 20 6f 6e 20 74 68 65 20 76 65 72 79 20  ing on the very 
31db0 66 69 72 73 74 20 61 63 63 65 73 73 20 74 6f 20  first access to 
31dc0 61 20 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72  a file, in order
31dd0 20 74 6f 20 73 61 76 65 20 61 0a 20 20 20 20 20   to save a.     
31de0 20 2a 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63   ** single unnec
31df0 65 73 73 61 72 79 20 73 71 6c 69 74 65 33 4f 73  essary sqlite3Os
31e00 52 65 61 64 28 29 20 63 61 6c 6c 20 61 74 20 74  Read() call at t
31e10 68 65 20 73 74 61 72 74 2d 75 70 2e 0a 20 20 20  he start-up..   
31e20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44     **.      ** D
31e30 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
31e40 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
31e50 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
31e60 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
31e70 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
31e80 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
31e90 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
31ea0 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
31eb0 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
31ec0 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
31ed0 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
31ee0 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
31ef0 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
31f00 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
31f10 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
31f20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
31f30 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
31f40 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
31f50 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
31f60 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
31f70 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
31f80 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
31f90 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
31fa0 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
31fb0 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
31fc0 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
31fd0 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
31fe0 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
31ff0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
32000 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
32010 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67       */.      Pg
32020 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  no nPage = 0;.  
32030 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56      char dbFileV
32040 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65  ers[sizeof(pPage
32050 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b  r->dbFileVers)];
32060 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ..      rc = pag
32070 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
32080 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
32090 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
320a0 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20   failed;..      
320b0 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
320c0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
320d0 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
320e0 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
320f0 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
32100 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32110 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
32120 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
32130 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
32140 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
32150 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32160 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
32170 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
32180 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
32190 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
321a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
321b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
321c0 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
321d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
321e0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
321f0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
32200 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
32210 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
32220 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
32230 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
32240 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
32250 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  t(pPager);..    
32260 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65      /* Unmap the
32270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
32280 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
32290 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f  hat external pro
322a0 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a  cesses.        *
322b0 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63  * may have trunc
322c0 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61 73  ated the databas
322d0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20  e file and then 
322e0 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b  extended it back
322f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69  .        ** to i
32300 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
32310 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
32320 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64  ess was not hold
32330 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20  ing a lock..    
32340 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
32350 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65 78  ase there may ex
32360 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70  ist a Pager.pMap
32370 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61 70   mapping that ap
32380 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a  pears.        **
32390 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68 74   to be the right
323a0 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74   size but is not
323b0 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e   actually valid.
323c0 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20   Avoid this.    
323d0 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69      ** possibili
323e0 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20  ty by unmapping 
323f0 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a  the db here. */.
32400 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45 46          if( USEF
32410 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a  ETCH(pPager) ){.
32420 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32430 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
32440 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
32450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
32460 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
32470 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20   there is a WAL 
32480 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
32490 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68  -system, open th
324a0 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57  is database in W
324b0 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20  AL.    ** mode. 
324c0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66  Otherwise, the f
324d0 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
324e0 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  n call is a no-o
324f0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  p..    */.    rc
32500 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49   = pagerOpenWalI
32510 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29  fPresent(pPager)
32520 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
32530 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73  _OMIT_WAL.    as
32540 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
32550 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  al==0 || rc==SQL
32560 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66  ITE_OK );.#endif
32570 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65  .  }..  if( page
32580 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
32590 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
325a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
325b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65      rc = pagerBe
325c0 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
325d0 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  on(pPager);.  }.
325e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
325f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
32600 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  N && rc==SQLITE_
32610 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
32620 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
32630 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64  ager, &pPager->d
32640 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61  bSize);.  }.. fa
32650 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  iled:.  if( rc!=
32660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32670 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
32680 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  );.    pager_unl
32690 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
326a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
326b0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
326c0 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  PEN );.  }else{.
326d0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
326e0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
326f0 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 68  R;.    pPager->h
32700 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
32710 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
32720 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
32730 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  If the reference
32740 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68   count has reach
32750 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63  ed zero, rollbac
32760 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20  k any active.** 
32770 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
32780 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
32790 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
327a0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
327b0 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74  EXCLUSIVE when t
327c0 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
327d0 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c  to in.** the rol
327e0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74  lback journal, t
327f0 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74  he unlock is not
32800 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74   performed and t
32810 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69  here is.** nothi
32820 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  ng to rollback, 
32830 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
32840 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a  is a no-op..*/ .
32850 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
32860 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
32870 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32880 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d    if( pPager->nM
32890 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73 71  mapOut==0 && (sq
328a0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
328b0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
328c0 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  che)==0) ){.    
328d0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
328e0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
328f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71    }.}../*.** Acq
32900 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65  uire a reference
32910 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
32920 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50  pgno in pager pP
32930 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20  ager (a page.** 
32940 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79  reference has ty
32950 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20  pe DbPage*). If 
32960 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
32970 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73  ference is .** s
32980 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61  uccessfully obta
32990 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69  ined, it is copi
329a0 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e  ed to *ppPage an
329b0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
329c0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
329d0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
329e0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
329f0 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73  the cache, it is
32a00 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
32a10 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20  therwise, a new 
32a20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61  page object is a
32a30 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70  llocated and pop
32a40 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ulated with data
32a50 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68  .** read from th
32a60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
32a70 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20   In some cases, 
32a80 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
32a90 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20  e may.** choose 
32aa0 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  not to allocate 
32ab0 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
32ac0 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20  t and may reuse 
32ad0 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f  an existing.** o
32ae0 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75  bject with no ou
32af0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
32b00 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nces..**.** The 
32b10 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
32b20 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
32b30 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
32b40 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  zed to zeros the
32b50 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20   .** first time 
32b60 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
32b70 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66   into memory. If
32b80 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73   the page reques
32b90 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61  ted is .** alrea
32ba0 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  dy in the cache 
32bb0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
32bc0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
32bd0 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20  en the extra.** 
32be0 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20  data is left as 
32bf0 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  it was when the 
32c00 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20  page object was 
32c10 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  last used..**.**
32c20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
32c30 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65   image is smalle
32c40 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
32c50 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20  sted page or if 
32c60 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76  a .** non-zero v
32c70 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61  alue is passed a
32c80 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  s the noContent 
32c90 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68  parameter and th
32ca0 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
32cb0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
32cc0 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ady stored in th
32cd0 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f  e cache, then no
32ce0 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b   .** actual disk
32cf0 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e   read occurs. In
32d00 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d   this case the m
32d10 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
32d20 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69  he .** page is i
32d30 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
32d40 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20  l zeros. .**.** 
32d50 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
32d60 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  true, it means t
32d70 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
32d80 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  re about the con
32d90 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tents.** of the 
32da0 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72  page. This occur
32db0 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  s in two scenari
32dc0 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
32dd0 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
32de0 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
32df0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
32e00 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
32e10 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
32e20 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
32e30 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
32e40 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
32e50 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
32e60 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
32e70 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
32e80 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
32e90 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
32ea0 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
32eb0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  al..**.** If noC
32ec0 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
32ed0 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65  then the data re
32ee0 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64  turned is zeroed
32ef0 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
32f00 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74  eing read from t
32f10 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
32f20 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62  itionally, the b
32f30 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  its correspondin
32f40 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20  g.** to pgno in 
32f50 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
32f60 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65   (bitvec of page
32f70 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65  s already writte
32f80 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  n to the.** jour
32f90 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
32fa0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
32fb0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
32fc0 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65  tvecs of any ope
32fd0 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20  n.** savepoints 
32fe0 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65  are set. This me
32ff0 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20  ans if the page 
33000 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
33010 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74   at any.** point
33020 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
33030 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
33040 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
33050 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74  e(), its content
33060 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s.** will not be
33070 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73   journaled. This
33080 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a   saves IO..**.**
33090 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
330a0 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
330b0 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
330c0 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
330d0 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
330e0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
330f0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
33100 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
33110 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
33120 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
33130 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
33140 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
33150 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
33160 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
33170 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
33180 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
33190 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
331a0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
331b0 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
331c0 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
331d0 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
331e0 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
331f0 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
33200 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
33210 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
33220 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
33230 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
33240 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
33250 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
33260 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
33270 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
33280 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
33290 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
332a0 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
332b0 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
332c0 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
332d0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
332e0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
332f0 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
33300 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
33310 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
33320 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
33330 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
33340 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
33350 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
33360 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
33370 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
33380 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
33390 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
333a0 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
333b0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
333c0 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
333d0 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  XXX flags */.){.
333e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
333f0 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70  E_OK;.  PgHdr *p
33400 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46  Pg = 0;.  u32 iF
33410 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rame = 0;       
33420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61            /* Fra
33430 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  me to read from 
33440 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  WAL file */.  co
33450 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  nst int noConten
33460 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  t = (flags & PAG
33470 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
33480 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61  );..  /* It is a
33490 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65  cceptable to use
334a0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
334b0 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79  ap) page for any
334c0 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a   page except.  *
334d0 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72  * page 1 if ther
334e0 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  e is no write-tr
334f0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
33500 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45  r the ACQUIRE_RE
33510 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67  ADONLY.  ** flag
33520 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62   was specified b
33530 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e  y the caller. An
33540 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65  d so long as the
33550 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20   db is not a .  
33560 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20  ** temporary or 
33570 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
33580 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  se.  */.  const 
33590 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70  int bMmapOk = (p
335a0 67 6e 6f 21 3d 31 20 26 26 20 55 53 45 46 45 54  gno!=1 && USEFET
335b0 43 48 28 70 50 61 67 65 72 29 0a 20 20 20 26 26  CH(pPager).   &&
335c0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
335d0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c  ==PAGER_READER |
335e0 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  | (flags & PAGER
335f0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a  _GET_READONLY)).
33600 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
33610 53 5f 43 4f 44 45 43 0a 20 20 20 26 26 20 70 50  S_CODEC.   && pP
33620 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a  ager->xCodec==0.
33630 23 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20 61  #endif.  );..  a
33640 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
33650 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
33660 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
33670 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
33680 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
33690 20 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65   assert( noConte
336a0 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b  nt==0 || bMmapOk
336b0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  ==0 );..  if( pg
336c0 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
336d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
336e0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
336f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68  ssert( pPager->h
33700 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
33710 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==1 );..  /* If 
33720 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
33730 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
33740 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
33750 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20   immediately. . 
33760 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72   ** Otherwise, r
33770 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65 20  equest the page 
33780 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20  from the PCache 
33790 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20  layer. */.  if( 
337a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
337b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
337c0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
337d0 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  rrCode;.  }else{
337e0 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b  .    if( bMmapOk
337f0 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
33800 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
33810 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
33820 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
33830 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69  ->pWal, pgno, &i
33840 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  Frame);.      if
33850 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33860 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
33870 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
33880 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b  .    if( bMmapOk
33890 20 26 26 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b   && iFrame==0 ){
338a0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
338b0 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72  ta = 0;..      r
338c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74  c = sqlite3OsFet
338d0 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a  ch(pPager->fd, .
338e0 20 20 20 20 20 20 20 20 20 20 28 69 36 34 29 28            (i64)(
338f0 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72  pgno-1) * pPager
33900 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67  ->pageSize, pPag
33910 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70  er->pageSize, &p
33920 44 61 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20  Data.      );.. 
33930 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
33940 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20  ITE_OK && pData 
33950 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
33960 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
33970 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a 20 20  GER_READER ){.  
33980 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 73 71          pPg = sq
33990 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
339a0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
339b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
339c0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
339d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
339e0 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
339f0 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  ge(pPager, pgno,
33a00 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a 20   pData, &pPg);. 
33a10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
33a20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
33a30 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
33a40 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d  >fd, (i64)(pgno-
33a50 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  1)*pPager->pageS
33a60 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  ize, pData);.   
33a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
33a80 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
33a90 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
33aa0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
33ab0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
33ac0 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20   pPg;.          
33ad0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
33ae0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33af0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
33b00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33b10 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
33b20 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
33b30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
33b40 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65    {.      sqlite
33b50 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70  3_pcache_page *p
33b60 42 61 73 65 3b 0a 20 20 20 20 20 20 70 42 61 73  Base;.      pBas
33b70 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
33b80 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
33b90 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29  PCache, pgno, 3)
33ba0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 61 73  ;.      if( pBas
33bb0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
33bc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
33bd0 68 65 46 65 74 63 68 53 74 72 65 73 73 28 70 50  heFetchStress(pP
33be0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
33bf0 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20 20  gno, &pBase);.  
33c00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33c10 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
33c20 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
33c30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
33c40 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ase==0 ){.      
33c50 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67      pPg = *ppPag
33c60 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
33c70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
33c80 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  EM;.          go
33c90 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
33ca0 5f 65 72 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _err;.        }.
33cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
33cc0 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71  g = *ppPage = sq
33cd0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
33ce0 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
33cf0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42  PCache, pgno, pB
33d00 61 73 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ase);.      asse
33d10 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20  rt( pPg!=0 );.  
33d20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
33d30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33d40 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
33d50 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
33d60 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20 72  3PcacheFetch() r
33d70 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
33d80 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   or the.    ** p
33d90 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64 79  ager was already
33da0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74   in the error-st
33db0 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
33dc0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
33dd0 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50  d..    ** Set pP
33de0 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20  g to 0 and jump 
33df0 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e  to the exception
33e00 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20   handler.  */.  
33e10 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67    pPg = 0;.    g
33e20 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
33e30 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73  e_err;.  }.  ass
33e40 65 72 74 28 20 70 50 67 3d 3d 28 2a 70 70 50 61  ert( pPg==(*ppPa
33e50 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
33e60 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f   pPg->pgno==pgno
33e70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
33e80 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
33e90 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72  r || pPg->pPager
33ea0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ==0 );..  if( pP
33eb0 67 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f  g->pPager && !no
33ec0 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f  Content ){.    /
33ed0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
33ee0 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64  he pcache alread
33ef0 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  y contains an in
33f00 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f  itialized copy o
33f10 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  f.    ** the pag
33f20 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  e. Return withou
33f30 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20  t further ado.  
33f40 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
33f50 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50  gno<=PAGER_MAX_P
33f60 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47  GNO && pgno!=PAG
33f70 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
33f80 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  r) );.    pPager
33f90 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
33fa0 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72  AT_HIT]++;.    r
33fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
33fc0 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ..  }else{.    /
33fd0 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68  * The pager cach
33fe0 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20  e has created a 
33ff0 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f  new page. Its co
34000 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a  ntent needs to .
34010 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61      ** be initia
34020 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20  lized.  */..    
34030 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
34040 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ager;..    /* Th
34050 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
34060 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
34070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
34080 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
34090 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65     ** number gre
340a0 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
340b0 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f  or the unused lo
340c0 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72  cking-page, is r
340d0 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20  equested. */.   
340e0 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
340f0 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
34100 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
34110 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
34120 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
34130 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
34140 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34150 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  ire_err;.    }..
34160 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c      if( MEMDB ||
34170 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
34180 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  pgno || noConten
34190 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61  t || !isOpen(pPa
341a0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
341b0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
341c0 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
341d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
341e0 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67  _FULL;.        g
341f0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34200 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
34210 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65       if( noConte
34220 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nt ){.        /*
34230 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20   Failure to set 
34240 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
34250 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65  InJournal bit-ve
34260 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e  ctors is benign.
34270 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d  .        ** It m
34280 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  erely means that
34290 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d   we might do som
342a0 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20  e extra work to 
342b0 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20  journal a .     
342c0 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20     ** page that 
342d0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
342e0 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20   be journaled.  
342f0 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65  Nevertheless, be
34300 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a   sure .        *
34310 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61  * to test the ca
34320 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f  se where a mallo
34330 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  c error occurs w
34340 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
34350 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  et .        ** a
34360 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65   bit in a bit ve
34370 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ctor..        */
34380 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34390 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
343a0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c();.        if(
343b0 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
343c0 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
343d0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
343e0 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42   rc = ) sqlite3B
343f0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
34400 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >pInJournal, pgn
34410 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  o);.          te
34420 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
34430 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
34440 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45      }.        TE
34450 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61  STONLY( rc = ) a
34460 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
34470 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e  vecs(pPager, pgn
34480 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
34490 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
344a0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
344b0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
344c0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
344d0 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
344e0 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
344f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34500 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
34510 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22  (("ZERO %p %d\n"
34520 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
34530 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
34540 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
34550 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 62 4d  al(pPager) && bM
34560 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  mapOk==0 ){.    
34570 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34580 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
34590 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
345a0 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20   &iFrame);.     
345b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
345c0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
345d0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
345e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
345f0 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
34600 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20  ==pPager );.    
34610 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
34620 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d  PAGER_STAT_MISS]
34630 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  ++;.      rc = r
34640 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69  eadDbPage(pPg, i
34650 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  Frame);.      if
34660 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34670 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
34680 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34690 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
346a0 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
346b0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20  agehash(pPg);.  
346c0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
346d0 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63  TE_OK;..pager_ac
346e0 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73  quire_err:.  ass
346f0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
34700 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20  OK );.  if( pPg 
34710 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
34720 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
34730 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b   }.  pagerUnlock
34740 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
34750 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  ;..  *ppPage = 0
34760 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
34770 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
34780 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
34790 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
347a0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
347b0 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
347c0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
347d0 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
347e0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
347f0 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
34800 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
34810 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53   cache. .**.** S
34820 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
34830 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20  agerGet().  The 
34840 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
34850 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
34860 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  ** and sqlite3Pa
34870 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74  gerGet() is that
34880 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
34890 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
348a0 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
348b0 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
348c0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
348d0 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
348e0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
348f0 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
34900 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
34910 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
34920 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
34930 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
34940 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69  .*/.DbPage *sqli
34950 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50  te3PagerLookup(P
34960 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
34970 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c 69  no pgno){.  sqli
34980 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20  te3_pcache_page 
34990 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  *pPage;.  assert
349a0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
349b0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
349c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
349d0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30  ager->pPCache!=0
349e0 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 73 71   );.  pPage = sq
349f0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
34a00 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
34a10 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61 73  , pgno, 0);.  as
34a20 73 65 72 74 28 20 70 50 61 67 65 3d 3d 30 20 7c  sert( pPage==0 |
34a30 7c 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c  | pPager->hasHel
34a40 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 3b 0a 20  dSharedLock );. 
34a50 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 29 20   if( pPage==0 ) 
34a60 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
34a70 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
34a80 46 65 74 63 68 46 69 6e 69 73 68 28 70 50 61 67  FetchFinish(pPag
34a90 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
34aa0 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  o, pPage);.}../*
34ab0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
34ac0 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a  ge reference..**
34ad0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
34ae0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
34af0 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
34b00 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
34b10 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
34b20 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
34b30 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
34b40 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
34b50 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
34b60 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
34b70 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
34b80 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
34b90 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
34ba0 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oved..*/.void sq
34bb0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
34bc0 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a 70  otNull(DbPage *p
34bd0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
34be0 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
34bf0 70 50 67 21 3d 30 20 29 3b 0a 20 20 70 50 61 67  pPg!=0 );.  pPag
34c00 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
34c10 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61  ;.  if( pPg->fla
34c20 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20  gs & PGHDR_MMAP 
34c30 29 7b 0a 20 20 20 20 70 61 67 65 72 52 65 6c 65  ){.    pagerRele
34c40 61 73 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b  aseMapPage(pPg);
34c50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
34c60 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
34c70 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  se(pPg);.  }.  p
34c80 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
34c90 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f  ed(pPager);.}.vo
34ca0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
34cb0 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
34cc0 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 20 73  ){.  if( pPg ) s
34cd0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
34ce0 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a  NotNull(pPg);.}.
34cf0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
34d00 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
34d10 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
34d20 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73  very write trans
34d30 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65  action..** There
34d40 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65   must already be
34d50 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
34d60 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
34d70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
34d80 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  * file when this
34d90 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
34da0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ed..**.** Open t
34db0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
34dc0 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
34dd0 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75   and write a jou
34de0 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74  rnal header.** t
34df0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
34e00 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  t. If there are 
34e10 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
34e20 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d  s, open the sub-
34e30 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65  journal.** as we
34e40 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
34e50 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77  n is only used w
34e60 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
34e70 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a  file is being .*
34e80 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74  * opened to writ
34e90 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67  e a rollback log
34ea0 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
34eb0 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73  on. It is not us
34ec0 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e  ed .** when open
34ed0 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ing a hot journa
34ee0 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69  l file to roll i
34ef0 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
34f00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34f10 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
34f20 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  n (as it may be 
34f30 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
34f40 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  e),.** then this
34f50 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77   function just w
34f60 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20  rites a journal 
34f70 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74  header to the st
34f80 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c  art of the.** al
34f90 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e  ready open file.
34fa0 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20   .**.** Whether 
34fb0 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
34fc0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
34fd0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
34fe0 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  on, the.** Pager
34ff0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
35000 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ec structure is 
35010 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
35020 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
35030 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
35040 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f  is successful. O
35050 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
35060 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
35070 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  M if the attempt
35080 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67   to allocate Pag
35090 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61  er.pInJournal fa
350a0 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49  ils, or .** an I
350b0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
350c0 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69  opening or writi
350d0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
350e0 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ile fails..*/.st
350f0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
35100 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
35110 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
35120 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35130 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35140 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
35150 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
35160 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
35170 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
35180 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c  pVfs;   /* Local
35190 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f   cache of vfs po
351a0 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  inter */..  asse
351b0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
351c0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
351d0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73  _LOCKED );.  ass
351e0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
351f0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
35200 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
35210 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
35220 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =0 );.  .  /* If
35230 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
35240 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69  error state, thi
35250 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
35260 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20  no-op.  But on. 
35270 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61   ** the other ha
35280 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nd, this routine
35290 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
352a0 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
352b0 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72  dy in.  ** an er
352c0 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ror state. */.  
352d0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
352e0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
352f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
35300 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67  ode;..  if( !pag
35310 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
35320 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
35330 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
35340 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
35350 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  {.    pPager->pI
35360 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
35370 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
35380 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
35390 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
353a0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
353b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
353c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
353d0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  }.  .    /* Open
353e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
353f0 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
35400 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
35410 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
35420 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
35430 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
35440 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
35450 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
35460 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
35470 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
35480 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
35490 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >jfd);.      }el
354a0 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  se{.        cons
354b0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20  t int flags =   
354c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354d0 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20  /* VFS flags to 
354e0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
354f0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53  e */.          S
35500 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
35510 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
35520 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
35530 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70     (pPager->temp
35540 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20  File ? .        
35550 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
35560 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
35570 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
35580 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
35590 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
355a0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
355b0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20  .          );.. 
355c0 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
355d0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
355e0 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65  se still has the
355f0 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 69 74   same name as it
35600 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20 20 20   did when.      
35610 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72 69 67    ** it was orig
35620 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a  inally opened. *
35630 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 64  /.        rc = d
35640 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64  atabaseIsUnmoved
35650 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
35660 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35670 5f 4f 4b 20 29 7b 0a 23 69 66 64 65 66 20 53 51  _OK ){.#ifdef SQ
35680 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
35690 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
356a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
356b0 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
356c0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
356d0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
356e0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
356f0 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
35700 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
35710 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a         );.#else.
35720 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
35730 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
35740 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
35750 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
35760 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e  , flags, 0);.#en
35770 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
35780 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
35790 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
357a0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
357b0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
357c0 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57  }.  .  .    /* W
357d0 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
357e0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
357f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35800 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20  e and open .    
35810 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
35820 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
35830 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
35840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35850 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
35860 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
35870 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
35880 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
35890 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
358a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
358b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
358c0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
358d0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
358e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
358f0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
35900 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
35910 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
35920 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
35930 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35940 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
35950 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
35960 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
35970 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
35980 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
35990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
359a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
359b0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
359c0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70  _LOCKED );.    p
359d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
359e0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
359f0 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  HEMOD;.  }..  re
35a00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
35a10 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
35a20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
35a30 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
35a40 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
35a50 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
35a60 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
35a70 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
35a80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
35a90 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
35aa0 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
35ab0 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
35ac0 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
35ad0 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
35ae0 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
35af0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
35b00 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
35b10 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
35b20 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
35b30 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
35b40 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
35b50 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
35b60 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
35b70 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
35b80 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
35b90 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
35ba0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
35bb0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
35bc0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
35bd0 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
35be0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
35bf0 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
35c00 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
35c10 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
35c20 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
35c30 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
35c40 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
35c50 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
35c60 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
35c70 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
35c80 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
35c90 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
35ca0 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
35cb0 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
35cc0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
35cd0 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
35ce0 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
35cf0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
35d00 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
35d10 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
35d20 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
35d30 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
35d40 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
35d50 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
35d60 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
35d70 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
35d80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
35d90 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
35da0 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
35db0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35dc0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
35dd0 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
35de0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
35df0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
35e00 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
35e10 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61  ER_READER && pPa
35e20 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
35e30 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61  R_ERROR );.  pPa
35e40 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
35e50 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
35e60 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57  mory;..  if( ALW
35e70 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61  AYS(pPager->eSta
35e80 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
35e90 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
35ea0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
35eb0 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69  nal==0 );..    i
35ec0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
35ed0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
35ee0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
35ef0 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
35f00 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64   use locking_mod
35f10 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64  e=exclusive, and
35f20 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63   an.      ** exc
35f30 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
35f40 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
35f50 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ot already held,
35f60 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a   obtain it now..
35f70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
35f80 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
35f90 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69  siveMode && sqli
35fa0 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
35fb0 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
35fc0 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  , -1) ){.       
35fd0 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
35fe0 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
35ff0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
36000 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
36030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
36040 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
36050 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
36060 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Wal, 1);.      }
36070 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20  ..      /* Grab 
36080 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
36090 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
360a0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75  If successful, u
360b0 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20  pgrade to.      
360c0 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
360d0 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  D state. Otherwi
360e0 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  se, return an er
360f0 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
36100 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a  caller..      **
36110 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   The busy-handle
36120 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64  r is not invoked
36130 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   if another conn
36140 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20  ection already. 
36150 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68       ** holds th
36160 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66  e write-lock. If
36170 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75   possible, the u
36180 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
36190 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a  call it..      *
361a0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
361b0 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74  ite3WalBeginWrit
361c0 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
361d0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
361e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
361f0 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  Obtain a RESERVE
36200 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
36210 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
36220 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d  the exFlag param
36230 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  eter.      ** is
36240 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65   true, then imme
36250 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20  diately upgrade 
36260 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55  this to an EXCLU
36270 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
36280 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e       ** busy-han
36290 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61  dler callback ca
362a0 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75  n be used when u
362b0 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20  pgrading to the 
362c0 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20  EXCLUSIVE.      
362d0 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74  ** lock, but not
362e0 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20   when obtaining 
362f0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
36300 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
36310 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
36320 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
36330 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
36340 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36350 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a  OK && exFlag ){.
36360 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
36370 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
36380 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
36390 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  E_LOCK);.      }
363a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
363b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
363c0 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65  .      /* Change
363d0 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   to WRITER_LOCKE
363e0 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  D state..      *
363f0 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d  *.      ** WAL m
36400 6f 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65  ode sets Pager.e
36410 53 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57  State to PAGER_W
36420 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20  RITER_LOCKED or 
36430 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a  CACHEMOD.      *
36440 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e  * when it has an
36450 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f   open transactio
36460 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20  n, but never to 
36470 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45  DBMOD or FINISHE
36480 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  D..      ** This
36490 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74   is because in t
364a0 68 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20  hose states the 
364b0 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63  code to roll bac
364c0 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  k savepoint .   
364d0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
364e0 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61  ns may copy data
364f0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
36500 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64  urnal into the d
36510 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a  atabase .      *
36520 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61  * file as well a
36530 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20  s into the page 
36540 63 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75  cache. Which wou
36550 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20  ld be incorrect 
36560 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c  in .      ** WAL
36570 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   mode..      */.
36580 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
36590 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
365a0 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  TER_LOCKED;.    
365b0 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
365c0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
365d0 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
365e0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
365f0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
36600 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
36610 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61  dbOrigSize = pPa
36620 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
36630 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
36640 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
36650 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ..    assert( rc
36660 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
36670 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
36680 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
36690 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
366a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
366b0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
366c0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
366d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
366e0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
366f0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d  e(pPager) );.  }
36700 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
36710 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
36720 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
36730 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  er)));.  return 
36740 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
36750 74 65 20 70 61 67 65 20 70 50 67 20 6f 6e 74 6f  te page pPg onto
36760 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
36770 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
36780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
36790 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
367a0 70 61 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f  pagerAddPageToRo
367b0 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 50 67  llbackJournal(Pg
367c0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
367d0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
367e0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
367f0 72 63 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  rc;.  u32 cksum;
36800 0a 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b  .  char *pData2;
36810 0a 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50  .  i64 iOff = pP
36820 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
36830 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c  ;..  /* We shoul
36840 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
36850 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36860 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
36870 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
36880 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
36890 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
368a0 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
368b0 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f  .  ** that we do
368c0 20 6e 6f 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72   not. */.  asser
368d0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
368e0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
368f0 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
36900 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
36910 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  lHdr<=pPager->jo
36920 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 43 4f  urnalOff );.  CO
36930 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67  DEC2(pPager, pPg
36940 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  ->pData, pPg->pg
36950 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
36960 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
36970 61 32 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20 70  a2);.  cksum = p
36980 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
36990 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
369a0 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61  ..  /* Even if a
369b0 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
369c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
369d0 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  ile journalling 
369e0 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  the.  ** page in
369f0 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
36a00 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73  , set the need-s
36a10 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65  ync flag for the
36a20 20 70 61 67 65 2e 0a 20 20 2a 2a 20 4f 74 68 65   page..  ** Othe
36a30 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20  rwise, when the 
36a40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
36a50 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
36a60 6c 6f 67 69 63 20 69 6e 0a 20 20 2a 2a 20 70 6c  logic in.  ** pl
36a70 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
36a80 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61  ) will think tha
36a90 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
36aa0 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a   to be restored.
36ab0 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
36ac0 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69  base file. And i
36ad0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
36ae0 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67  curs while doing
36af0 20 73 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63   so,.  ** then c
36b00 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f  orruption may fo
36b10 6c 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  llow..  */.  pPg
36b20 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
36b30 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 72  _NEED_SYNC;..  r
36b40 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
36b50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66  pPager->jfd, iOf
36b60 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  f, pPg->pgno);. 
36b70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36b80 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
36b90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
36ba0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
36bb0 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
36bc0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66  r->pageSize, iOf
36bd0 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  f+4);.  if( rc!=
36be0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
36bf0 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 77 72  rn rc;.  rc = wr
36c00 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
36c10 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67  ->jfd, iOff+pPag
36c20 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
36c30 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63  cksum);.  if( rc
36c40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
36c50 74 75 72 6e 20 72 63 3b 0a 0a 20 20 49 4f 54 52  turn rc;..  IOTR
36c60 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
36c70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
36c80 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
36c90 0a 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67  .           pPag
36ca0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
36cb0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
36cc0 29 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  ));.  PAGER_INCR
36cd0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
36ce0 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
36cf0 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55  PAGERTRACE(("JOU
36d00 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
36d10 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
36d20 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
36d30 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
36d40 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  ), pPg->pgno, . 
36d50 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
36d60 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
36d70 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f  NC)?1:0), pager_
36d80 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
36d90 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
36da0 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50  nalOff += 8 + pP
36db0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
36dc0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
36dd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
36de0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
36df0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
36e00 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
36e10 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
36e20 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74   pPg->pgno);.  t
36e30 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
36e40 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 61  ITE_NOMEM );.  a
36e50 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
36e60 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
36e70 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 63  TE_NOMEM );.  rc
36e80 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69   |= addToSavepoi
36e90 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
36ea0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
36eb0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
36ec0 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
36ed0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
36ee0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
36ef0 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65  ** Mark a single
36f00 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
36f10 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67  iteable. The pag
36f20 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
36f30 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a  o the .** main j
36f40 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
36f50 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65  urnal as require
36f60 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  d. If the page i
36f70 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  s written into.*
36f80 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * one of the jou
36f90 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65  rnals, the corre
36fa0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
36fb0 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50  set in the .** P
36fc0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
36fd0 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50  bitvec and the P
36fe0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
36ff0 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
37000 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65  cs.** of any ope
37010 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20  n savepoints as 
37020 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
37030 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
37040 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
37050 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
37060 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
37070 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
37080 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54  LITE_OK;..  /* T
37090 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
370a0 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73  ot called unless
370b0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
370c0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
370d0 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72   .  ** been star
370e0 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ted. The journal
370f0 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79   file may or may
37100 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20   not be open at 
37110 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
37120 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c   It is never cal
37130 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52  led in the ERROR
37140 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61   state..  */.  a
37150 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
37160 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
37170 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20  TER_LOCKED.     
37180 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
37190 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
371a0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
371b0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
371c0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
371d0 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
371e0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
371f0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
37200 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
37210 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
37220 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
37230 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d  Pager->readOnly=
37240 3d 30 20 29 3b 0a 20 20 43 48 45 43 4b 5f 50 41  =0 );.  CHECK_PA
37250 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54  GE(pPg);..  /* T
37260 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37270 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e  needs to be open
37280 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c  ed. Higher level
37290 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61   routines have a
372a0 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61  lready.  ** obta
372b0 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61  ined the necessa
372c0 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69  ry locks to begi
372d0 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  n the write-tran
372e0 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65  saction, but the
372f0 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  .  ** rollback j
37300 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
37310 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70   yet be open. Op
37320 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69  en it now if thi
37330 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  s is the case.. 
37340 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
37350 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c   done before cal
37360 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  ling sqlite3Pcac
37370 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e  heMakeDirty() on
37380 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a   the page. .  **
37390 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69   Otherwise, if i
373a0 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65  t were done afte
373b0 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  r calling sqlite
373c0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
373d0 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e  (), then.  ** an
373e0 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63   error might occ
373f0 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  ur and the pager
37400 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e   would end up in
37410 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
37420 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70  tate.  ** with p
37430 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64  ages marked as d
37440 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68  irty in the cach
37450 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
37460 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37470 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
37480 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  D ){.    rc = pa
37490 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
374a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
374b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
374c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
374d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
374e0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
374f0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
37500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
37510 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
37520 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
37530 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
37540 74 68 61 74 20 69 73 20 61 62 6f 75 74 20 74 6f  that is about to
37550 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20   be modified as 
37560 64 69 72 74 79 2e 20 2a 2f 0a 20 20 73 71 6c 69  dirty. */.  sqli
37570 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
37580 74 79 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  ty(pPg);..  /* I
37590 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  f a rollback jou
375a0 72 6e 61 6c 20 69 73 20 69 6e 20 75 73 65 2c 20  rnal is in use, 
375b0 74 68 65 6d 20 6d 61 6b 65 20 73 75 72 65 20 74  them make sure t
375c0 68 65 20 70 61 67 65 20 74 68 61 74 20 69 73 20  he page that is 
375d0 61 62 6f 75 74 0a 20 20 2a 2a 20 74 6f 20 63 68  about.  ** to ch
375e0 61 6e 67 65 20 69 73 20 69 6e 20 74 68 65 20 72  ange is in the r
375f0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
37600 20 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 20   or if the page 
37610 69 73 20 61 20 6e 65 77 20 70 61 67 65 20 6f 66  is a new page of
37620 66 0a 20 20 2a 2a 20 74 68 65 6e 20 65 6e 64 20  f.  ** then end 
37630 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 6d 61 6b  of the file, mak
37640 65 20 73 75 72 65 20 69 74 20 69 73 20 6d 61 72  e sure it is mar
37650 6b 65 64 20 61 73 20 50 47 48 44 52 5f 4e 45 45  ked as PGHDR_NEE
37660 44 5f 53 59 4e 43 2e 0a 20 20 2a 2f 0a 20 20 61  D_SYNC..  */.  a
37670 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
37680 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 29 20 3d  pInJournal!=0) =
37690 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
376a0 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70  >jfd) );.  if( p
376b0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
376c0 6c 21 3d 30 0a 20 20 20 26 26 20 73 71 6c 69 74  l!=0.   && sqlit
376d0 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e  e3BitvecTestNotN
376e0 75 6c 6c 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ull(pPager->pInJ
376f0 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
37700 6f 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 61  o)==0.  ){.    a
37710 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
37720 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
37730 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
37740 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
37750 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
37760 72 63 20 3d 20 70 61 67 65 72 41 64 64 50 61 67  rc = pagerAddPag
37770 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e  eToRollbackJourn
37780 61 6c 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  al(pPg);.      i
37790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
377a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
377b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
377c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
377d0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
377e0 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te!=PAGER_WRITER
377f0 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20  _DBMOD ){.      
37800 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
37810 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
37820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50  .      }.      P
37830 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45  AGERTRACE(("APPE
37840 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
37850 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
37860 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
37870 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
37880 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
37890 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
378a0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
378b0 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 7d  C)?1:0)));.    }
378c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
378d0 47 48 44 52 5f 44 49 52 54 59 20 62 69 74 20 69  GHDR_DIRTY bit i
378e0 73 20 73 65 74 20 61 62 6f 76 65 20 77 68 65 6e  s set above when
378f0 20 74 68 65 20 70 61 67 65 20 77 61 73 20 61 64   the page was ad
37900 64 65 64 20 74 6f 20 74 68 65 20 64 69 72 74 79  ded to the dirty
37910 2d 6c 69 73 74 0a 20 20 2a 2a 20 61 6e 64 20 62  -list.  ** and b
37920 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68  efore writing th
37930 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
37940 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
37950 2e 20 20 57 61 69 74 20 75 6e 74 69 6c 20 6e 6f  .  Wait until no
37960 77 2c 0a 20 20 2a 2a 20 61 66 74 65 72 20 74 68  w,.  ** after th
37970 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
37980 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6a 6f 75  successfully jou
37990 72 6e 61 6c 6c 65 64 2c 20 62 65 66 6f 72 65 20  rnalled, before 
379a0 73 65 74 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  setting the.  **
379b0 20 50 47 48 44 52 5f 57 52 49 54 45 41 42 4c 45   PGHDR_WRITEABLE
379c0 20 62 69 74 20 74 68 61 74 20 69 6e 64 69 63 61   bit that indica
379d0 74 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  tes that the pag
379e0 65 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20  e can be safely 
379f0 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20  modified..  */. 
37a00 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
37a10 47 48 44 52 5f 57 52 49 54 45 41 42 4c 45 3b 0a  GHDR_WRITEABLE;.
37a20 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73    .  /* If the s
37a30 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
37a40 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
37a50 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
37a60 69 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72  it,.  ** then wr
37a70 69 74 65 20 74 68 65 20 70 61 67 65 20 69 6e 74  ite the page int
37a80 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
37a90 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
37aa0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  if( pPager->nSav
37ab0 65 70 6f 69 6e 74 3e 30 20 29 7b 0a 20 20 20 20  epoint>0 ){.    
37ac0 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
37ad0 61 67 65 49 66 52 65 71 75 69 72 65 64 28 70 50  ageIfRequired(pP
37ae0 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  g);.  }..  /* Up
37af0 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
37b00 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
37b10 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  n. */.  if( pPag
37b20 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e  er->dbSize<pPg->
37b30 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
37b40 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
37b50 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65  ->pgno;.  }.  re
37b60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37b70 2a 20 54 68 69 73 20 69 73 20 61 20 76 61 72 69  * This is a vari
37b80 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 50 61  ant of sqlite3Pa
37b90 67 65 72 57 72 69 74 65 28 29 20 74 68 61 74 20  gerWrite() that 
37ba0 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20 73 65  runs when the se
37bb0 63 74 6f 72 20 73 69 7a 65 0a 2a 2a 20 69 73 20  ctor size.** is 
37bc0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
37bd0 70 61 67 65 20 73 69 7a 65 2e 20 20 53 51 4c 69  page size.  SQLi
37be0 74 65 20 6d 61 6b 65 73 20 74 68 65 20 28 72 65  te makes the (re
37bf0 61 73 6f 6e 61 62 6c 65 29 20 61 73 73 75 6d 70  asonable) assump
37c00 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 61 6c 6c  tion that.** all
37c10 20 62 79 74 65 73 20 6f 66 20 61 20 73 65 63 74   bytes of a sect
37c20 6f 72 20 61 72 65 20 77 72 69 74 74 65 6e 20 74  or are written t
37c30 6f 67 65 74 68 65 72 20 62 79 20 68 61 72 64 77  ogether by hardw
37c40 61 72 65 2e 20 20 48 65 6e 63 65 2c 20 61 6c 6c  are.  Hence, all
37c50 20 62 79 74 65 73 20 6f 66 0a 2a 2a 20 61 20 73   bytes of.** a s
37c60 65 63 74 6f 72 20 6e 65 65 64 20 74 6f 20 62 65  ector need to be
37c70 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 69 6e 20 63   journalled in c
37c80 61 73 65 20 6f 66 20 61 20 70 6f 77 65 72 20 6c  ase of a power l
37c90 6f 73 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  oss in the middl
37ca0 65 20 6f 66 0a 2a 2a 20 61 20 77 72 69 74 65 2e  e of.** a write.
37cb0 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20  .**.** Usually, 
37cc0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
37cd0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
37ce0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70 61 67  equal to the pag
37cf0 65 20 73 69 7a 65 2c 20 69 6e 20 77 68 69 63 68  e size, in which
37d00 0a 2a 2a 20 63 61 73 65 20 70 61 67 65 73 20 63  .** case pages c
37d10 61 6e 20 62 65 20 69 6e 64 69 76 69 64 75 61 6c  an be individual
37d20 6c 79 20 77 72 69 74 74 65 6e 2e 20 20 54 68 69  ly written.  Thi
37d30 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 72  s routine only r
37d40 75 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78  uns in the.** ex
37d50 63 65 70 74 69 6f 6e 61 6c 20 63 61 73 65 20 77  ceptional case w
37d60 68 65 72 65 20 74 68 65 20 70 61 67 65 20 73 69  here the page si
37d70 7a 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ze is smaller th
37d80 61 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  an the sector si
37d90 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ze..*/.static SQ
37da0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
37db0 74 20 70 61 67 65 72 57 72 69 74 65 4c 61 72 67  t pagerWriteLarg
37dc0 65 53 65 63 74 6f 72 28 50 67 48 64 72 20 2a 70  eSector(PgHdr *p
37dd0 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
37de0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
37df0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
37e00 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61  de */.  Pgno nPa
37e10 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
37e20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
37e30 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
37e40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
37e50 2f 0a 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20  /.  Pgno pg1;   
37e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e70 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
37e80 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
37e90 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
37ea0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  */.  int nPage =
37eb0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
37ec0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
37ed0 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
37ee0 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
37ef0 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
37f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f10 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
37f20 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 53  r */.  int needS
37f30 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ync = 0;        
37f40 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
37f50 6e 79 20 70 61 67 65 20 68 61 73 20 50 47 48 44  ny page has PGHD
37f60 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 20  R_NEED_SYNC */. 
37f70 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
37f80 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
37f90 20 54 68 65 20 70 61 67 65 72 20 74 68 61 74 20   The pager that 
37fa0 6f 77 6e 73 20 70 50 67 20 2a 2f 0a 20 20 50 67  owns pPg */.  Pg
37fb0 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  no nPagePerSecto
37fc0 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63  r = (pPager->sec
37fd0 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e  torSize/pPager->
37fe0 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  pageSize);..  /*
37ff0 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 70   Set the doNotSp
38000 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 74  ill NOSYNC bit t
38010 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63  o 1. This is bec
38020 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61  ause we cannot a
38030 6c 6c 6f 77 0a 20 20 2a 2a 20 61 20 6a 6f 75 72  llow.  ** a jour
38040 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65  nal header to be
38050 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e   written between
38060 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e   the pages journ
38070 61 6c 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 69  aled by.  ** thi
38080 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  s function..  */
38090 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
380a0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  B );.  assert( (
380b0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
380c0 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e  ll & SPILLFLAG_N
380d0 4f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 70  OSYNC)==0 );.  p
380e0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
380f0 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4e  l |= SPILLFLAG_N
38100 4f 53 59 4e 43 3b 0a 0a 20 20 2f 2a 20 54 68 69  OSYNC;..  /* Thi
38110 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20  s trick assumes 
38120 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61  that both the pa
38130 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
38140 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 2a 2a  or-size are.  **
38150 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65   an integer powe
38160 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20  r of 2. It sets 
38170 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20  variable pg1 to 
38180 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
38190 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
381a0 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
381b0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
381c0 65 64 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 67  ed on..  */.  pg
381d0 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d  1 = ((pPg->pgno-
381e0 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53  1) & ~(nPagePerS
381f0 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a  ector-1)) + 1;..
38200 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 70    nPageCount = p
38210 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
38220 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e   if( pPg->pgno>n
38230 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
38240 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
38250 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
38260 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
38270 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
38280 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
38290 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
382a0 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 7d  Count+1-pg1;.  }
382b0 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 67 65 20  else{.    nPage 
382c0 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
382d0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 6e  ;.  }.  assert(n
382e0 50 61 67 65 3e 30 29 3b 0a 20 20 61 73 73 65 72  Page>0);.  asser
382f0 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f  t(pg1<=pPg->pgno
38300 29 3b 0a 20 20 61 73 73 65 72 74 28 28 70 67 31  );.  assert((pg1
38310 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
38320 6f 29 3b 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b  o);..  for(ii=0;
38330 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
38340 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
38350 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  ){.    Pgno pg =
38360 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 50 67 48   pg1+ii;.    PgH
38370 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 69  dr *pPage;.    i
38380 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  f( pg==pPg->pgno
38390 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76   || !sqlite3Bitv
383a0 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
383b0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29  InJournal, pg) )
383c0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 21 3d  {.      if( pg!=
383d0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
383e0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
383f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
38400 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
38410 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
38420 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
38430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
38440 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
38450 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
38460 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
38470 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
38480 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
38490 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
384a0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
384b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
384c0 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
384d0 6c 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  l(pPage);.      
384e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
384f0 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65  }else if( (pPage
38500 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
38510 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
38520 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ))!=0 ){.      i
38530 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
38540 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
38550 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 53  ){.        needS
38560 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ync = 1;.      }
38570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
38580 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
38590 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
385a0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50  }..  /* If the P
385b0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
385c0 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61  lag is set for a
385d0 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20  ny of the nPage 
385e0 70 61 67 65 73 20 0a 20 20 2a 2a 20 73 74 61 72  pages .  ** star
385f0 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65  ting at pg1, the
38600 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  n it needs to be
38610 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20   set for all of 
38620 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20  them. Because.  
38630 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  ** writing to an
38640 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65  y of these nPage
38650 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67   pages may damag
38660 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68  e the others, th
38670 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  e.  ** journal f
38680 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ile must contain
38690 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73   sync()ed copies
386a0 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a   of all of them.
386b0 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20    ** before any 
386c0 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77  of them can be w
386d0 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
386e0 65 20 64 61 74 61 62 61 73